knc105/0000755000175000017500000000000012073504127010146 5ustar dandanknc105/po/0000755000175000017500000000000012073504127010564 5ustar dandanknc105/po/cs.po0000644000175000017500000004614212073503741011541 0ustar dandan# translation of cs.po to # Daniel Prynych , 2010. msgid "" msgstr "" "Project-Id-Version: cs\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2009-02-21 12:24+0100\n" "Last-Translator: Daniel Prynych \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #: knutclient.cpp:94 msgid "Ready." msgstr "Připraven." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "Spojení bylo chybné. Následující spojení bude za %1 sekund." #: knutclient.cpp:481 msgid "Data OK" msgstr "Data v pořádku" #: knutclient.cpp:576 msgid "UPS is off." msgstr "UPS je vypnuta." #: knutclient.cpp:579 msgid "UPS is back on." msgstr "UPS je připojena." #: knutclient.cpp:584 msgid "Power is back online." msgstr "Síťové napájení obnoveno." #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "UPS běží na baterie." #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "Baterie je vybita." #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "UPS baterie je v pořádku." #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "UPS baterie je špatná a je jí potřeba vyměnit." #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "UPS je přetížena." #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "UPS není přetížena." #: knutclient.cpp:615 #, fuzzy msgid "UPS is performing calibration." msgstr "UPS provádí kalibraci." #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "Kalibrace UPS je ukončena." #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "UPS navyšuje vstupní napětí." #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "Navyšovaní napětí je ukončeno." #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "UPS uřezává vstupní napětí." #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "Ořezávaní napětí je ukončeno." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "Spojení bylo obnoveno." #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "Spojení bylo uzavřeno druhou stranou (upsd)." #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Přepnuto" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "Obnovit spojení" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "Jste si jistý ?" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Název" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "Jméno UPS" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "Adresa UPS" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Stav : " #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "Spojení neexistuje." #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "Provoz na sít" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "Provoz na baterie" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "Provoz na sít " #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "Baterie je vybita." #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Vyměnit baterie" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "UPS provádí kalibraci." #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "UPS je přetížena" #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "UPS uřezává vstupní napětí" #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "UPS navyšuje vstupní napětí" #: knutdock.cpp:461 msgid "Error : " msgstr "Chyba : " #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Výrobce : " #: knutdock.cpp:468 msgid "Serial" msgstr "Sériové č." #: knutdock.cpp:470 msgid "Firmware" msgstr "Verze Firmware" #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "Runtime" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 min" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Kapacita baterie" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "Zatížení UPS" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "&Zobrazení UPS proměnných a příkazů" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "&Spuštění okamžitých příkazů" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "&Nastavení UPS RW proměnných" #: knutdock.cpp:623 msgid "&Preferences" msgstr "N&astavení" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "&O aplikaci KNutClient" #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Minimalizovat" #: knutdock.cpp:629 msgid "&Exit" msgstr "&Konec" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "Přetížení" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "Baterie je vybita" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "Kalibrace UPS" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "Sériové č. : " #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Ver. firmware : " #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Okamžité příkazy" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "Spustit stálý příkaz" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Příkaz:" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "Uživatelské jméno:" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Heslo:" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "test připojení z " #: knutmainwindow.cpp:699 #, fuzzy msgid "UPS Label" msgstr "Jméno UPS" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Ukončí program" #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "&Použít popis" #: knutmainwindow.cpp:753 #, fuzzy msgid "Reconnect the application" msgstr "Ukončí program" #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Zpoždění (ms):" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Port:" #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "Uložit NUT heslo do konfiguračního souboru" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "Dostupné UPS proměnné" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "Vybrané UPS proměnné" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "UPS Proměnné" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Nezadané jméno nebo adresa UPS" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "Toto jméno již existuje" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "Zpoždění musí být číslo" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "Port musí byt číslo" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "Port musí být v rozsahu od 1025 do 65535" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "Zpoždění je příliš malé" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Nastavení UPS" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Nastavení" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Hlavní nastavení" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Počet sloupců :" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Použít vlastní barvu pozadí" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Barva pozadí :" #: knutprefdlg.cpp:710 msgid "Use dialog \"Are you sure\"" msgstr "Použít dialog \"Jste si jistý\"" #: knutprefdlg.cpp:712 msgid "Use Main window when program is started" msgstr "Použít hlavní okno když program startuje" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "" #: knutprefdlg.cpp:715 #, fuzzy msgid "No" msgstr "Žádný výběr" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "Automaticky" #: knutprefdlg.cpp:718 msgid "Show message window, when program reports error" msgstr "Zobrazit okno zpráv, když program hlásí chybu" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Napětí/Frekvence" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Vstupní napětí" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&230 V" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 V" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Vstupní frekvence" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Hz" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Hz" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "&Použít input.transfer hodnoty" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "UPS" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "Nastavení UPS" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "Př&idat" #: knutprefdlg.cpp:793 #, fuzzy msgid "&Edit" msgstr "&Konec" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "&Smazat" #: knutprefdlg.cpp:813 msgid "Dock bar" msgstr "Dokovací lišta" #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "Nastavení dokovaní" #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "Typ zobrazení v doku" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Prvky ToolTipu" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Obrázkové" #: knutprefdlg.cpp:832 msgid "&General" msgstr "&Souhrnné" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "Výr&obce" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "&Model" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "&Sériové č." #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "Verze &Firmware" #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "&Runtime" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "&Kapacita baterie" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "&Zatížení UPS" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Použít vlastní barvu pozadí" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Barva pozadí pro ikonu :" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Panel" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Nastavení hlavního panelu" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "&Přetížení" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "&Baterie je vybita" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "&Vyměnit baterie" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "&Kalibrace UPS" #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "Výrobce + M&odel" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "Písmo" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Nastavení písma" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "&Použít vlastní písma" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Hlavní panel" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Analogové panely" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Analog" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Nastavení analogových panelů" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Použít vlastní barvy" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Barva ručičky :" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Barva OK rozsahu :" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Barva rozsahu varovaní :" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Barva rozsahu chyby :" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Barva stupnice :" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Barva písma :" #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "Vylepšení zpracovaní ručičky :" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "Žádné" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "Rychlé" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "Vylepšené" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "Rychlé a rozostření okrajů" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "Vylepšené a rozostření okrajů" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "UPS proměnné" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Obnovit" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Hodnota" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Popis" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Okamžité příkazy" #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Měnitelné hodnoty" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Stálé hodnoty" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "NASTAVIT RW PROMĚNOU" #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Proměnná" #: knutrwvar.cpp:58 msgid "Value:" msgstr "Hodnota" #: knutvardata.cpp:63 msgid "None" msgstr "Žádný výběr" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Vstupní napětí" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "Teplota UPS" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Vstupní frekvence" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "Vnější teplota" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Vnější vlhkost" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Napětí baterie" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Výstupní napětí" #: knutvardata.cpp:73 msgid "Output Current" msgstr "Výstupní proud" #: knutvardata.cpp:74 msgid "Output Frequency" msgstr "Výstupní frekvence" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Teplota baterie" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Proud baterie" #: knutvardata.cpp:77 #, fuzzy msgid "Input Current" msgstr "Výstupní proud" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "Příkon UPS" #: knutvardata.cpp:209 #, fuzzy msgid "No memory." msgstr "Není dostatek paměti" #: knutvardata.cpp:210 msgid "No address." msgstr "Nezadaná adresa" #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Neznámá adresa" #: knutvardata.cpp:214 msgid "Error of connection." msgstr "Chyba spojení" #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "Síťová chyba, možná byl odpojen kabel." #: knutvardata.cpp:220 msgid "No connection with server." msgstr "Neexistuje spojeni se serverem." #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Protokol server-klient nebo nebo proměnné NUT-u jsou neznámé." #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "Nezadaná adresa" #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "Spojeni bylo serverem odmítnuto." #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "Server nepřijímá data." #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "Server neposílá data." #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "Server neodpovídá." #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "Server vrací data v neznámém formátu." #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "Server vrací neznámá data." #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "Příkaz VER vrací data v neznámém formátu." #: knutvardata.cpp:234 msgid "No data." msgstr "Žádná data" #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Přístup odmítnut. Špatné heslo ?" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "UPS nemůže poslat data na server. (Data se nemění)" #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "Server nezná tento příkaz." #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "Ovladač pro UPS není připojen." #: knutvardata.cpp:245 msgid "Server required password." msgstr "Server požaduje heslo." #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Nesprávné heslo." #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "UPS neodpovídá." #: knutvardata.cpp:248 msgid "Command failed." msgstr "Špatný příkaz." #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "UPS nezná tento okamžitý příkaz." #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "UPS nepodporuje tento okamžitý příkaz." #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "UPS nezná tuto proměnou." #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "UPS nepodporuje tuto proměnou." #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "UPS nepodporuje tuto hodnotu v této proměnné." #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "Jméno UPS-ky je neznámé ." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "Uživatelské jméno již byla zadáno." #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "Heslo již bylo zadáno." #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "Server neposílá seznam proměnných." #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Neznámá chyba" #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Klient pro UPS systém NUT" #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "" #: main.cpp:41 msgid "Daniel Prynych" msgstr "" #: main.cpp:43 msgid "Arnaud Quette" msgstr "" #: main.cpp:44 msgid "MGE" msgstr "" #: main.cpp:48 #, fuzzy msgid "Don't dock in SysTray" msgstr "Neumístit do doku (SysTray)" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "&Soubor" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 #, fuzzy msgid "&Settings" msgstr "Nastavení" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "Spojení" #: rc.cpp:10 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Uživatelské jméno:" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #~ msgid "" #~ "_: NAME OF TRANSLATORS\n" #~ "Your names" #~ msgstr "Daniel Prynych" #~ msgid "" #~ "_: EMAIL OF TRANSLATORS\n" #~ "Your emails" #~ msgstr "Daniel@prynych.cz" #~ msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" #~ msgstr "upsd > 1.2 nepodporuje UDP. Spojení je přepnuto na TCP." #~ msgid "New Ups" #~ msgstr "Nová UPS" #~ msgid "Variables" #~ msgstr "UPS Proměnné" #~ msgid "RW variables" #~ msgstr "UPS RW Proměnné" knc105/po/knutclient.pot0000644000175000017500000003502312073503741013474 0ustar dandan# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: knutclient.cpp:94 msgid "Ready." msgstr "" #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "" #: knutclient.cpp:481 msgid "Data OK" msgstr "" #: knutclient.cpp:576 msgid "UPS is off." msgstr "" #: knutclient.cpp:579 msgid "UPS is back on." msgstr "" #: knutclient.cpp:584 msgid "Power is back online." msgstr "" #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "" #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "" #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "" #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "" #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "" #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "" #: knutclient.cpp:615 msgid "UPS is performing calibration." msgstr "" #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "" #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "" #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "" #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "" #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "" #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "" #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "" #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "" #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "" #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "" #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "" #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "" #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "" #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "" #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "" #: knutdock.cpp:461 msgid "Error : " msgstr "" #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "" #: knutdock.cpp:468 msgid "Serial" msgstr "" #: knutdock.cpp:470 msgid "Firmware" msgstr "" #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr "" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "" #: knutdock.cpp:623 msgid "&Preferences" msgstr "" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "" #: knutdock.cpp:627 msgid "&Minimize" msgstr "" #: knutdock.cpp:629 msgid "&Exit" msgstr "" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "" #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "" #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "" #: knutmainwindow.cpp:699 msgid "UPS Label" msgstr "" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "" #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "" #: knutmainwindow.cpp:753 msgid "Reconnect the application" msgstr "" #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "" #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "" #: knutprefdlg.cpp:710 msgid "Use dialog \"Are you sure\"" msgstr "" #: knutprefdlg.cpp:712 msgid "Use Main window when program is started" msgstr "" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "" #: knutprefdlg.cpp:715 msgid "No" msgstr "" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "" #: knutprefdlg.cpp:718 msgid "Show message window, when program reports error" msgstr "" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "" #: knutprefdlg.cpp:793 msgid "&Edit" msgstr "" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "" #: knutprefdlg.cpp:813 msgid "Dock bar" msgstr "" #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "" #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "" #: knutprefdlg.cpp:832 msgid "&General" msgstr "" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "" #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "" #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "" #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "" #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "" #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "" #: knutrwvar.cpp:55 msgid "Variable:" msgstr "" #: knutrwvar.cpp:58 msgid "Value:" msgstr "" #: knutvardata.cpp:63 msgid "None" msgstr "" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "" #: knutvardata.cpp:73 msgid "Output Current" msgstr "" #: knutvardata.cpp:74 msgid "Output Frequency" msgstr "" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "" #: knutvardata.cpp:77 msgid "Input Current" msgstr "" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "" #: knutvardata.cpp:209 msgid "No memory." msgstr "" #: knutvardata.cpp:210 msgid "No address." msgstr "" #: knutvardata.cpp:211 msgid "Unknown address." msgstr "" #: knutvardata.cpp:214 msgid "Error of connection." msgstr "" #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "" #: knutvardata.cpp:220 msgid "No connection with server." msgstr "" #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "" #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "" #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "" #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "" #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "" #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "" #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "" #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "" #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "" #: knutvardata.cpp:234 msgid "No data." msgstr "" #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "" #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "" #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "" #: knutvardata.cpp:245 msgid "Server required password." msgstr "" #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "" #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "" #: knutvardata.cpp:248 msgid "Command failed." msgstr "" #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "" #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "" #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "" #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "" #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "" #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "" #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "" #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "" #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "" #: knutvardata.cpp:262 msgid "Unknown error." msgstr "" #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "" #: main.cpp:37 msgid "KNutClient" msgstr "" #: main.cpp:38 msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "" #: main.cpp:41 msgid "Daniel Prynych" msgstr "" #: main.cpp:43 msgid "Arnaud Quette" msgstr "" #: main.cpp:44 msgid "MGE" msgstr "" #: main.cpp:48 msgid "Don't dock in SysTray" msgstr "" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 msgid "&Settings" msgstr "" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "" #: rc.cpp:10 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" knc105/po/fr.po0000644000175000017500000005265012073503741011544 0ustar dandan# translation of fr.po to Français # translation of fr.po to # translation of fr.po to Czech # translation of fr.po to français # Copyright (C) 2003, 2004 Free Software Foundation, Inc. # Daniel Prynych , 2003, 2004. # # Arnaud Quette , 2003, 2004, 2010. msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2010-03-10 22:05+0100\n" "Last-Translator: Arnaud Quette \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: knutclient.cpp:94 msgid "Ready." msgstr "Prêt." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "La connexion a échoué. Nouvelle tentative dans %1·sec." #: knutclient.cpp:481 msgid "Data OK" msgstr "Données OK" #: knutclient.cpp:576 msgid "UPS is off." msgstr "Onduleur arrêté" #: knutclient.cpp:579 msgid "UPS is back on." msgstr "Onduleur démarré" #: knutclient.cpp:584 msgid "Power is back online." msgstr "Retour secteur" #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "Onduleur sur batterie" #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "Onduleur Batterie basse" #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "Batterie OK" #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "La batterie doit être remplacée." #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "L'onduleur est en surcharge." #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "L'onduleur n'est pas en surcharge." #: knutclient.cpp:615 msgid "UPS is performing calibration." msgstr "UPS is performing calibration.d'étalonnage." #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "Calibrage onduleur terminé." #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "L'onduleur est en redressement de la tension d'entrée." #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "Redressement de la tension d'entrée terminé." #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "L'onduleur est en rabaissement de la tension d'entrée." #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "Rabaissement de la tension d'entrée terminé." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "La connexion a été renouvelé." #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "La connexion a été fermé par la seconde partie (upsd)." #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Basculé" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "Reconnexion" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "Êtes vous sûr ?" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Nom" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "Onduleur" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "Adresse Onduleur" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Statut : " #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "Cette connexion n'existe pas." #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "Sur secteur" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "Sur batterie" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "Onduleur arrêté" #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "Niveau batterie basse" #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Remplacer la batterie" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "Calibrage onduleur en cours" #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "En surcharge" #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "L'onduleur rabaisse la tension" #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "L'onduleur redresse la tension" #: knutdock.cpp:461 msgid "Error : " msgstr "Erreur : " #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Fabricant : " #: knutdock.cpp:468 msgid "Serial" msgstr "N° de série" #: knutdock.cpp:470 msgid "Firmware" msgstr "Vers. Fw." #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "Autonomie" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 min" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Charge de la batterie" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "Charge de l'onduleur" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "&Voir les variables et commandes onduleurs" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "Commandes &instantanées" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "Configurer les &variables de l'onduleur" #: knutdock.cpp:623 msgid "&Preferences" msgstr "&Préférences" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "&A propos de KNutClient" #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Réduire" #: knutdock.cpp:629 msgid "&Exit" msgstr "&Sortir" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "En surcharge" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "Niveau batterie bas" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "Calibrage onduleur" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "N° série : " #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Vers. Fw. : " #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Commandes directes" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "Lancer Commande Directe" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Commande :" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "Utilisateur :" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Mot de passe :" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "test de connexion depuis 5" #: knutmainwindow.cpp:699 msgid "UPS Label" msgstr "Label onduleur" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "ComboBox onduleur" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Quitter l'application." #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "&Utiliser les descriptions" #: knutmainwindow.cpp:753 msgid "Reconnect the application" msgstr "Reconnecter l'application" #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Délai (ms):" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Port :" #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "Stocker le mot de passe NUT dans le fichier de configuration" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "Valeurs disponibles" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "Valeurs sélectionnées" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "Variables de l'onduleur" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Pas de nom ou d'adresse pour l'onduleur" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "Ce nom existe" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "Le délai doit être un nombre" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "Le port doit être un nombre" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "Le port doit valoir de 1025 à 65535" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "Le délai est trop faible" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Préférences" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Paramètres" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Paramètres principaux" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Nombre de colonnes :" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Utiliser une couleur de fond personnalisée :" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Couleur de fond :" #: knutprefdlg.cpp:710 msgid "Use dialog \"Are you sure\"" msgstr "Utiliser la boite de dialogue \"Êtes vous sûr\"" #: knutprefdlg.cpp:712 msgid "Use Main window when program is started" msgstr "Utiliser la Fenêtre Principale au démarrage du programme" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "Oui" #: knutprefdlg.cpp:715 msgid "No" msgstr "Non" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "Auto" #: knutprefdlg.cpp:718 msgid "Show message window, when program reports error" msgstr "" "Afficher la fenêtre de message, lorsque le programme rapporte une erreur" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Tension/Fréquence" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Tension d'entrée nominale" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&230 V" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 V" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Fréquence d'entrée nominale" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Hz" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Hz" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "&Utiliser les valeurs High-Low.input.transfer" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "Onduleur" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "Paramètres de l'onduleur" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "&Ajouter" #: knutprefdlg.cpp:793 msgid "&Edit" msgstr "&Editer" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "&Supprimer" #: knutprefdlg.cpp:813 msgid "Dock bar" msgstr "Dock" #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "Paramètres du dock" #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "Type d'affichage du dock" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Eléments de l'aide contextuelle" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Image" #: knutprefdlg.cpp:832 msgid "&General" msgstr "&Général" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "F&abricant" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "M&odèle" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "N°&Série" #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "&Vers. Fw." #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "&Autonomie" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "&Charge de la batterie" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "Charge de l'&onduleur" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Utiliser une couleur de fond personnalisée pour les icones :" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Couleur de fond des icones :" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Panneau" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Paramètres du panneau" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "En &Surcharge" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "&Batterie faible" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "R&emplacer la batterie" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "&Calibration de l'onduleur" #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "&Fabricant. + Modèle" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "Polices" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Paramètres des Polices" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "&Utiliser les polices personnalisées" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Panneau principal" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Panneau analogique" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Analogique" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Paramètres du panneau analogique" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Utiliser d'autres couleurs personnalisées" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Couleur du pointeur :" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Couleur pour \"OK\" :" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Couleur des avertissements :" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Couleur des erreurs :" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Couleur de l'échelle :" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Couleur des polices :" #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "Traitement numérique des pointeurs :" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "Aucun traitement" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "Anti crénelage rapide" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "Anti crénelage fin" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "Anti crénelage rapide et fondu animé" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "Anti crénelage fin et fondu animé" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "Variables de l'onduleur" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Recharger les variables" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Valeur" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Descriptions" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Commandes directes" #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Variables en lecture/écriture" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Variables en lecture seule" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "Affecter une variable" #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Variables :" #: knutrwvar.cpp:58 msgid "Value:" msgstr "Valeur" #: knutvardata.cpp:63 msgid "None" msgstr "Aucun" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Tension d'entrée" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "Température de l'onduleur" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Fréquence d'entrée" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "Température extérieure" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Humidité extérieure" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Tension de la batterie" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Tension de sortie" #: knutvardata.cpp:73 msgid "Output Current" msgstr "Courant de sortie" #: knutvardata.cpp:74 msgid "Output Frequency" msgstr "Fréquence de Sortie" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Température de la batterie" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Courant de la batterie" #: knutvardata.cpp:77 msgid "Input Current" msgstr "Courant d'entrée" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "Puissance de l'onduleur" #: knutvardata.cpp:209 msgid "No memory." msgstr "Pas de mémoire." #: knutvardata.cpp:210 msgid "No address." msgstr "Pas d'adresse." #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Adresse inconnue." #: knutvardata.cpp:214 msgid "Error of connection." msgstr "Erreur de connexion." #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "Erreur réseau, le cable réseau a peut être été débranché." #: knutvardata.cpp:220 msgid "No connection with server." msgstr "Pas de connexion avec le serveur." #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Le protocole Client-Server ou les variables NUT sont inconnues." #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "Pas d'onduleur à cette adresse." #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "La connexion a été refusée par le serveur." #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "Le serveur n'a pas reçu les données." #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "Le serveur n'a pas renvoyé de données." #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "Le serveur ne réponds pas." #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "Le serveur a retourné des données dans un format inconnu." #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "Le serveur a retourné des données inconnues." #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "La commande VER a retourné des données dans un format inconnu." #: knutvardata.cpp:234 msgid "No data." msgstr "Pas de données" #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Accès refusé : mot de passe invalide ?" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "L'onduleur ne communique pas avec le serveur (Données Périmées)" #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "Le serveur ne connaît pas cette commande." #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "Le pilote de cet onduleur n'est pas connecté." #: knutvardata.cpp:245 msgid "Server required password." msgstr "Le serveur requiert un mot de passe." #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Mot de passe incorrect." #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "L'onduleur ne réponds pas." #: knutvardata.cpp:248 msgid "Command failed." msgstr "La commande a échoué." #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "L'onduleur ne connaît pas cette commande directe." #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "L'onduleur ne supporte pas cette commande directe." #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "L'onduleur ne connaît pas cette variable." #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "L'onduleur ne supporte pas cette variable." #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "L'onduleur ne supporte pas cette valeur pour cette variable." #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "Cette onduleur est inconnu." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "Le nom d'utilisateur a déjà été entré." #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "Le mot de passe a déjà été entré." #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "Le serveur n'a pas renvoyé la liste de variables." #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Erreur inconnue." #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Client pour Network UPS Tools" #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 #, fuzzy msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "(C) 2002 - 2010 Daniel Prynych" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "Zajecov, République Tchèque " #: main.cpp:41 msgid "Daniel Prynych" msgstr "Daniel Prynych" #: main.cpp:43 msgid "Arnaud Quette" msgstr "Arnaud Quette" #: main.cpp:44 msgid "MGE" msgstr "MGE" #: main.cpp:48 msgid "Don't dock in SysTray" msgstr "Ne pas docker dans la barre d'état système" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "&Fichier" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 msgid "&Settings" msgstr "&Paramètres" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "&Connection" #: rc.cpp:10 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Votre nom" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "Vos courriers électroniques" #~ msgid "color of the background" #~ msgstr "Couleur de l'arrière plan :" #~ msgid "color of the foreground" #~ msgstr "Couleur de l'avant plan :" #~ msgid "size of a ball" #~ msgstr "taille d'une balle" #~ msgid "Background color:" #~ msgstr "Couleur d'arrière plan :" #~ msgid "Choose a new background color" #~ msgstr "Choisir une nouvelle couleur d'arrière plan" #~ msgid "Project age:" #~ msgstr "Age du projet :" #~ msgid "Foreground color:" #~ msgstr "Couleur d'avant plan :" #~ msgid "Choose a new foreground color" #~ msgstr "Choisir une nouvelle couleur d'avant plan :" #~ msgid "Set the project age (in days)" #~ msgstr "Fixer l'âge du projet (en jours)" #~ msgid "Change the project age (in days) by choosing a new number of days." #~ msgstr "" #~ "Changer l'age du projet (en jours) en sélectionnant un nouveau nombre de " #~ "jours." #~ msgid "&Use High-Low XFER" #~ msgstr "&Utiliser Niveau Transfert Haut-Bas" #~ msgid "" #~ "_: NAME OF TRANSLATORS\n" #~ "Your names" #~ msgstr "Arnaud de Lorbeau,Arnaud Quette" #~ msgid "" #~ "_: EMAIL OF TRANSLATORS\n" #~ "Your emails" #~ msgstr "adelorbeau@mandrakesoft.com,arnaud.quette@free.fr" #~ msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" #~ msgstr "upsd > 1.2 ne supporte pas UDP. La connexion est basculé en TCP" #~ msgid "New Ups" #~ msgstr "Nouvel Onduleur" #~ msgid "Variables" #~ msgstr "Variables" #~ msgid "RW variables" #~ msgstr "Variables en lecture/écriture" #~ msgid "Toggle the toolbar..." #~ msgstr "Afficher la barre d'outils..." #~ msgid "Toggle the statusbar..." #~ msgstr "Afficher la barre d'état..." #~ msgid "Protocol" #~ msgstr "Protocole" #~ msgid "UDP" #~ msgstr "UDP" #~ msgid "TCP" #~ msgstr "TCP" knc105/po/CMakeLists.txt0000644000175000017500000000236611436653731013343 0ustar dandanFIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt) IF(NOT GETTEXT_MSGFMT_EXECUTABLE) MESSAGE( "------ NOTE: msgfmt not found. Translations will *not* be installed ------") ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE) SET(catalogname knutclient) ADD_CUSTOM_TARGET(translations ALL) FILE(GLOB PO_FILES *.po) FOREACH(_poFile ${PO_FILES}) GET_FILENAME_COMPONENT(_poFileName ${_poFile} NAME) STRING(REGEX REPLACE "^${catalogname}_?" "" _langCode ${_poFileName} ) STRING(REGEX REPLACE "\\.po$" "" _langCode ${_langCode} ) IF( _langCode ) GET_FILENAME_COMPONENT(_lang ${_poFile} NAME_WE) SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) ADD_CUSTOM_COMMAND(TARGET translations COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile} DEPENDS ${_poFile}) INSTALL(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo) ENDIF( _langCode ) ENDFOREACH(_poFile ${PO_FILES}) ENDIF(NOT GETTEXT_MSGFMT_EXECUTABLE) knc105/po/extract-messages.sh0000644000175000017500000000336711436653731014420 0ustar dandan #!/bin/sh BASEDIR="../src/" # root of translatable sources PROJECT="knutclient" # project name BUGADDR="" # MSGID-Bugs WDIR=`pwd` # working dir echo "Preparing rc files" cd ${BASEDIR} # we use simple sorting to make sure the lines do not jump around too much from system to system find . -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort > ${WDIR}/rcfiles.list xargs --arg-file=${WDIR}/rcfiles.list extractrc > ${WDIR}/rc.cpp # additional string for KAboutData echo 'i18nc("NAME OF TRANSLATORS","Your names");' >> ${WDIR}/rc.cpp echo 'i18nc("EMAIL OF TRANSLATORS","Your emails");' >> ${WDIR}/rc.cpp cd ${WDIR} echo "Done preparing rc files" echo "Extracting messages" cd ${BASEDIR} # see above on sorting find . -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort > ${WDIR}/infiles.list echo "rc.cpp" >> ${WDIR}/infiles.list cd ${WDIR} xgettext --from-code=UTF-8 -C -kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 \ -kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \ --files-from=infiles.list -D ${BASEDIR} -D ${WDIR} -o ${PROJECT}.pot || { echo "error while calling xgettext. aborting."; exit 1; } echo "Done extracting messages" echo "Merging translations" catalogs=`find . -name '*.po'` for cat in $catalogs; do echo $cat msgmerge -o $cat.new $cat ${PROJECT}.pot mv $cat.new $cat done echo "Done merging translations" echo "Cleaning up" cd ${WDIR} rm rcfiles.list rm infiles.list rm rc.cpp echo "Done" knc105/po/pt_BR.po0000644000175000017500000005130212073503741012134 0ustar dandan# translation of pt_BR.po to Czech # tradução de knutclient.po para Brazilian Portuguese # translation of pt_BR.po to Brazilian Portuguese # translation of knutclient.po to Brazilian Portuguese # Copyright (C) 2008 Free Software Foundation, Inc. # Wellington Terumi Uemura , 2008. # Lisiane Sztoltz Teixeira , 2004. # Daniel Prynych , 2004. # msgid "" msgstr "" "Project-Id-Version: pt_BR\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2008-05-29 14:32+0200\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: gedit 2.22.0\n" #: knutclient.cpp:94 msgid "Ready." msgstr "Pronto." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "A conexão falhou. Uma nova conexão será feita depois de %1 segundos." #: knutclient.cpp:481 msgid "Data OK" msgstr "Dados OK" #: knutclient.cpp:576 msgid "UPS is off." msgstr "O no-break está desligado." #: knutclient.cpp:579 msgid "UPS is back on." msgstr "O no-break está ligado." #: knutclient.cpp:584 msgid "Power is back online." msgstr "A força retornou." #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "O no-break está funcionado com bateria." #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "A bateria do no-break está fraca." #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "A bateria do no-break está OK." #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "A bateria do no-break está com problemas e precisa ser trocada." #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "O no-break está sobrecarregado." #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "O no-break não está sobrecarregado." #: knutclient.cpp:615 #, fuzzy msgid "UPS is performing calibration." msgstr "O no-break está sendo calibrado" #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "A calibração do no-break foi finalizada." #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "O no-break está aumentando a voltagem de entrada." #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "O aumento de voltagem de entrada do no-break terminou." #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "O no-break está ajustando a voltagem de entrada." #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "O ajuste da entrada da voltagem do no-break terminou." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "A conexão foi fechada pelo no-break (upsd)." #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "A conexão foi fechada pelo no-break (upsd)" #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Comutado" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "Reconectar" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "Você tem certeza?" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Nome" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "Nome do No-break" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "Endereço do No-break" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Status :" #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "A conexão não existe." #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "No-break Ativo" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "No-break Usando Bateria" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "No-break desconectado" #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "A bateria do no-break está fraca" #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Troque a bateria" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "O no-break está sendo calibrado" #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "O no-break está sobrecarregado" #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "O no-break está ajustando a voltagem" #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "O no-break está aumentando a voltagem" #: knutdock.cpp:461 msgid "Error : " msgstr "Erro : " #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Fabric. : " #: knutdock.cpp:468 msgid "Serial" msgstr "No. de série" #: knutdock.cpp:470 msgid "Firmware" msgstr "Firmware" #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "Em Execução" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 min" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Carga da Bateria" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "Carga do No-break" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "&Mostrar os comandos e variáveis do no-break" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "&Executar comandos instantâneos" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "Definir variáveis de &Leit./Escr." #: knutdock.cpp:623 msgid "&Preferences" msgstr "&Configurações" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "&Sobre o KNutClient" #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Minimizar" #: knutdock.cpp:629 msgid "&Exit" msgstr "S&air" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "Sobrecarga do No-break" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "No-break com Bateria Fraca" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "Calibragem do No-break" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "Serial : " #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Vers. do Firm.:" #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Comandos instantâneos" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "EXECUTAR COMANDO INSTANTÂNEO" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Comando:" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "Nome do usuário:" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Senha:" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "teste de conexão à partir de 5" #: knutmainwindow.cpp:699 #, fuzzy msgid "UPS Label" msgstr "Nome do No-break" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Finalizar o aplicação" #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "&Usar descrições" #: knutmainwindow.cpp:753 #, fuzzy msgid "Reconnect the application" msgstr "Finalizar o aplicação" #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Atraso (ms):" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Porta: " #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "Armazenar a senha do NUT no arquivo de configuração" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "Variáveis do No-break" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Sem Nome ou Endereço do No-break" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "Este nome já existe" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "O valor de Atraso deve ser numérico" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "O valor da Porta deve ser numérico" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "O valor da Porta deve conter um valor de 1025 até 65535" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "O Atraso é muito pequeno" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Preferências" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Configuração" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Configuração Principal" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Quantidade de colunas:" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Utilizar cor do plano de fundo personalizado" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Cor do plano de fundo:" #: knutprefdlg.cpp:710 msgid "Use dialog \"Are you sure\"" msgstr "Usar diálogo \"Você tem certeza?\" :" #: knutprefdlg.cpp:712 msgid "Use Main window when program is started" msgstr "Usar janela principal quando o programa iniciar" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "" #: knutprefdlg.cpp:715 #, fuzzy msgid "No" msgstr "Nenhum" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "" #: knutprefdlg.cpp:718 msgid "Show message window, when program reports error" msgstr "Mostrar janela de mensagem quando o programa reportar um erro" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Voltagem/Freqüência" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Entrada de Voltagem Nominal" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&230 V" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 V" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Freqüência de entrada nominal" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Hz" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Hz" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "No-break" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "Configuração do No-break" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "&Adicionar" #: knutprefdlg.cpp:793 #, fuzzy msgid "&Edit" msgstr "S&air" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "" #: knutprefdlg.cpp:813 #, fuzzy msgid "Dock bar" msgstr "Encaixar" #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "Configuração do encaixe" #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "Mostrar os tipos de encaixe" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Itens da ferramenta de dicas" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Figura" #: knutprefdlg.cpp:832 msgid "&General" msgstr "&Geral" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "F&abricante" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "M&odelo" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "No de &série" #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "&Ver. do Firm.: " #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "Em E&xecução" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "Carga da &Bateria" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "Carga do &No-break" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Utilizar ícones com cor do plano de fundo personalizado" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Cor de plano de fundo do ícone:" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Painel" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Configuração do painel" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "&Carga do No-break" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "&Bateria do No-break com pouca carga" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "Tro&que a bateria" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "&Calibragem do No-break" #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "Fabricante + &Modelo" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Configuração de Fontes" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "&Utilizar fonte personalizada" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Painel principal" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Painel analógico" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Analógico" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Configuração do painel analógico" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Utilizar outras cores personalizadas" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Cor do ponteiro:" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Cor do limite OK:" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Cor do limite de aviso:" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Cor do limite de erro:" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Cor da escala :" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Cor da fonte :" #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "Cor do ponteiro:" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "Nada sendo processado" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "Suavização rápida de amostra" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "Suavização fina de amostra" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "Suavização rápida de amostra e desfoque gaussiano" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "Suavização fina de amostra e desfoque gaussiano" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "Variáveis do No-break" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Recarregar variáveis" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Valor" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Descrição" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Comandos Instantâneos" #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Variáveis de Leitura/Escrita" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Variáveis Apenas de Leitura" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "DEFINIR VARIÁVEL DE LEIT./ESCR." #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Variável:" #: knutrwvar.cpp:58 msgid "Value:" msgstr "Valor:" #: knutvardata.cpp:63 msgid "None" msgstr "Nenhum" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Voltagem de Entrada" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "Temperatura do No-break" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Freqüência de Entrada" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "Temperatura Exterior" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Umidade Exterior" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Voltagem da Bateria" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Voltagem de Saída" #: knutvardata.cpp:73 msgid "Output Current" msgstr "Corrente de Saída" #: knutvardata.cpp:74 msgid "Output Frequency" msgstr "Freqüência de Saída" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Temperatura da Bateria" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Corrente da Bateria" #: knutvardata.cpp:77 #, fuzzy msgid "Input Current" msgstr "Corrente de Saída" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "" #: knutvardata.cpp:209 #, fuzzy msgid "No memory." msgstr "Sem Memória." #: knutvardata.cpp:210 msgid "No address." msgstr "Sem endereço." #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Endereço desconhecido." #: knutvardata.cpp:214 msgid "Error of connection." msgstr "Erro de Conexão." #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "" #: knutvardata.cpp:220 msgid "No connection with server." msgstr "Sem conexão com o servidor." #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Protocolo cliente-servidor ou variáveis do NUT são desconhecidas." #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "Não há nenhum no-break neste endereço." #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "Conexão foi recusada pelo servidor." #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "O servidor não está recebendo dados." #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "O servidor não está enviando dados." #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "O servidor não está respondendo." #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "O servidor retornou dados com um formato desconhecido." #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "O servidor retornou dados desconhecidos." #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "O comando VER retornou dados com um formato desconhecido." #: knutvardata.cpp:234 msgid "No data." msgstr "Sem dados." #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Acesso negado. Senha errada?" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "O no-break não consegue enviar dados para o servidor (pane de dados)." #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "O servidor desconhece este comando." #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "O driver do no-break não está conectado." #: knutvardata.cpp:245 msgid "Server required password." msgstr "O servidor precisa de uma senha." #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Senha incorreta." #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "O no-break não responde." #: knutvardata.cpp:248 msgid "Command failed." msgstr "O comando falhou." #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "O no-break desconhece este comando instantâneo." #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "O no-break não tem suporte para este comando instantâneo." #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "O no-break desconhece esta variável." #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "O no-break não tem suporte para esta variável." #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "O no-break não tem suporte para este valor nesta variável." #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "O nome do no-break é desconhecido." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "O nome de usuário já foi alterado." #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "A senha já foi informada." #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "O servidor não envia a lista de variáveis." #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Erro desconhecido." #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Cliente para No-break de Rede" #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "" #: main.cpp:41 msgid "Daniel Prynych" msgstr "" #: main.cpp:43 msgid "Arnaud Quette" msgstr "" #: main.cpp:44 msgid "MGE" msgstr "" #: main.cpp:48 #, fuzzy msgid "Don't dock in SysTray" msgstr "Não encaixar no painel" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 #, fuzzy msgid "&Settings" msgstr "Configuração" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "&Conexão" #: rc.cpp:10 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Nome do usuário:" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #, fuzzy #~ msgid "color of the background" #~ msgstr "Cor do plano de fundo:" #, fuzzy #~ msgid "color of the foreground" #~ msgstr "Cor do plano de fundo:" #, fuzzy #~ msgid "Background color:" #~ msgstr "Utilizar cor do plano de fundo personalizado" #, fuzzy #~ msgid "Choose a new background color" #~ msgstr "Utilizar cor do plano de fundo personalizado" #~ msgid "&Use High-Low XFER" #~ msgstr "&Usar XFER Baixo/Alto" #~ msgid "" #~ "_: NAME OF TRANSLATORS\n" #~ "Your names" #~ msgstr "Wellington Terumi Uemura" #~ msgid "" #~ "_: EMAIL OF TRANSLATORS\n" #~ "Your emails" #~ msgstr "wellingtonuemura@gmail.com" #~ msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" #~ msgstr "" #~ "upsd > 1.2 não tem suporte para UDP. A conexão foi alternada para TCP" #~ msgid "New Ups" #~ msgstr "Novo No-break" #~ msgid "Variables" #~ msgstr "Variáveis" #~ msgid "RW variables" #~ msgstr "Variáveis de Leit./Escr." knc105/po/es.po0000644000175000017500000006334712073503741011551 0ustar dandan# translation of es.po to Spanish # tradução de knutclient.po para Brazilian Portuguese # Copyright (C) 2004, 2008 Free Software Foundation, Inc. # # Wellington Terumi Uemura , 2006. # Lisiane Sztoltz Teixeira , 2004. # Daniel Prynych , 2004. # Mad-Soft , 2008. msgid "" msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2009-02-22 23:12+0100\n" "Last-Translator: Mad-Soft \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" # knutclient.cpp:74 #: knutclient.cpp:94 msgid "Ready." msgstr "Listo." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "La conexión ha fallado. La reconexión se hará despues de %1 segundos." # knutclient.cpp:462 knutclient.cpp:463 #: knutclient.cpp:481 msgid "Data OK" msgstr "Datos OK" # knutclient.cpp:526 knutclient.cpp:527 #: knutclient.cpp:576 msgid "UPS is off." msgstr "SAI está apagado." # knutclient.cpp:530 knutclient.cpp:531 #: knutclient.cpp:579 msgid "UPS is back on." msgstr "SAI ha vuelto." # knutclient.cpp:536 knutclient.cpp:537 #: knutclient.cpp:584 msgid "Power is back online." msgstr "Ha vuelto la corriente." # knutclient.cpp:542 knutclient.cpp:543 #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "SAI funciona con batería." # knutclient.cpp:548 knutclient.cpp:549 #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "Batería baja del SAI" # knutclient.cpp:552 knutclient.cpp:553 #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "La batería del SAI esta OK." # knutclient.cpp:558 knutclient.cpp:559 #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "La batería del SAI está mal y necesita ser reemplazada." # knutclient.cpp:564 knutclient.cpp:565 #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "SAI está sobrecargado." # knutclient.cpp:568 knutclient.cpp:569 #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "SAI no está sobrecargado." # knutclient.cpp:574 knutclient.cpp:575 knutdock.cpp:322 #: knutclient.cpp:615 #, fuzzy msgid "UPS is performing calibration." msgstr "SAI está siendo calibrado." # knutclient.cpp:578 knutclient.cpp:579 #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "La calibración del SAI ha finalizado." # knutclient.cpp:584 knutclient.cpp:585 #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "SAI está aumentando el voltaje de entrada." # knutclient.cpp:588 knutclient.cpp:589 #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "Finalizó el aumento de voltaje del SAI." # knutclient.cpp:594 knutclient.cpp:595 #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "SAI está ajustando el voltaje de entrada." # knutclient.cpp:598 knutclient.cpp:599 #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "Finalizó el ajuste de voltaje del SAI." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "La conexión se renovó." #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "La conexión fué cerrado por otra instancia (upsd)." # knutclient.cpp:615 knutclient.cpp:672 knutclient.cpp:679 #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Cambiado." #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "Reconectar" # knutdock.cpp:427 knutmainwindow.cpp:377 #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "¿Estás seguro?" # knutdock.cpp:292 knutdock.cpp:342 knutfrontpanel.cpp:164 # knutnewupsdlg.cpp:64 knutprintupsvar.cpp:75 #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Nombre" # knutdock.cpp:293 knutnewupsdlg.cpp:76 #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "Nombre del SAI" # knutdock.cpp:294 knutnewupsdlg.cpp:70 #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "Dirección del SAI" # knutdock.cpp:295 knutdock.cpp:316 knutdock.cpp:319 knutdock.cpp:322 # knutdock.cpp:325 knutdock.cpp:328 knutdock.cpp:331 #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Estado :" # knutdock.cpp:298 knutvardata.cpp:192 #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "La conexión no existe." # knutdock.cpp:302 knutfrontpanel.cpp:70 #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "SAI activo." # knutdock.cpp:306 knutfrontpanel.cpp:83 #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "SAI en batería" # knutdock.cpp:310 #: knutdock.cpp:434 msgid "UPS Of line" msgstr "SAI inactivo" # knutdock.cpp:316 #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "SAI batería baja" # knutdock.cpp:319 knutfrontpanel.cpp:122 #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Cambia la batería" # knutclient.cpp:574 knutclient.cpp:575 knutdock.cpp:322 #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "SAI está siendo calibrado." # knutdock.cpp:325 #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "SAI está sobrecargado" # knutdock.cpp:328 #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "SAI está ajustando el voltaje" # knutdock.cpp:331 #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "SAI está aumentando el voltaje" # knutdock.cpp:337 #: knutdock.cpp:461 msgid "Error : " msgstr "Error :" # knutdock.cpp:340 knutfrontpanel.cpp:154 #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Fabricante :" # knutdock.cpp:344 #: knutdock.cpp:468 msgid "Serial" msgstr "Nº Serie" # knutdock.cpp:346 #: knutdock.cpp:470 msgid "Firmware" msgstr "Firmware" # knutdock.cpp:350 knutfrontpanel.cpp:194 #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "En Ejecución" # knutdock.cpp:350 #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 min" # knutdock.cpp:357 knutvardata.cpp:43 #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Carga batería" # knutdock.cpp:364 knutvardata.cpp:46 #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "Carga del SAI" # knutdock.cpp:402 knutmainwindow.cpp:639 #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "&Mostrar comandos y variables del SAI" # knutdock.cpp:403 knutmainwindow.cpp:640 #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "&Ejecutar comandos instantaneos" # knutdock.cpp:404 knutmainwindow.cpp:641 #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "Definir variables de &Lect/Esc." # knutdock.cpp:406 #: knutdock.cpp:623 msgid "&Preferences" msgstr "&Opciones" # knutdock.cpp:408 #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "&Acerca de KNutClient" # knutdock.cpp:410 #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Minimizar" # knutdock.cpp:412 #: knutdock.cpp:629 msgid "&Exit" msgstr "&Salir" # knutfrontpanel.cpp:96 #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "SAI Sobrecarga" # knutfrontpanel.cpp:109 #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "SAI Batería baja" # knutfrontpanel.cpp:135 #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "SAI calibración" # knutfrontpanel.cpp:174 #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "Nº Serie : " # knutfrontpanel.cpp:184 #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Firm. rev. : " # knutinstcomms.cpp:33 #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Comandos instantaneos" # knutinstcomms.cpp:48 #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "EJECUTAR COMANDO INSTANTANEO" # knutinstcomms.cpp:52 #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Comando:" # knutinstcomms.cpp:56 knutnewupsdlg.cpp:95 knutrwvar.cpp:70 #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "Nombre de usuario:" # knutinstcomms.cpp:57 knutnewupsdlg.cpp:102 knutrwvar.cpp:71 #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Contraseña:" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "test de conexión desde 5" # knutdock.cpp:293 knutnewupsdlg.cpp:76 #: knutmainwindow.cpp:699 #, fuzzy msgid "UPS Label" msgstr "Nombre del SAI" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "" # knutmainwindow.cpp:636 #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Salir de la aplicación" # knutmainwindow.cpp:644 #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "&Usar descripciones" # knutmainwindow.cpp:636 #: knutmainwindow.cpp:753 #, fuzzy msgid "Reconnect the application" msgstr "Salir de la aplicación" # knutnewupsdlg.cpp:82 #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Retraso (ms):" # knutnewupsdlg.cpp:89 #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Puerto:" # knutnewupsdlg.cpp:109 #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "Guardar contraseña de NUT en el archivo de configuración" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "Valores UPS Disponibles" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "Valores UPS Seleccionados" # knutnewupsdlg.cpp:123 #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "Variables del SAI" # knutnewupsdlg.cpp:227 #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Sin nombre o direccion del SAI" # knutnewupsdlg.cpp:234 #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "El nombre ya existe" # knutnewupsdlg.cpp:241 #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "Retraso debe ser numérico" # knutnewupsdlg.cpp:247 #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "Puerto debe ser numérico" # knutnewupsdlg.cpp:252 #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "Puerto debe estar entre 1025 y 65535" # knutnewupsdlg.cpp:257 #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "Retraso demasiado pequeño" # knutprefdlg.cpp:464 #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Opciones" # knutprefdlg.cpp:42 #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Configuración" # knutprefdlg.cpp:42 #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Configuración Principal" # knutprefdlg.cpp:55 #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Número de columnas:" # knutprefdlg.cpp:58 knutprefdlg.cpp:317 knutprefdlg.cpp:394 #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Usar color de fondo personalizado" # knutprefdlg.cpp:62 knutprefdlg.cpp:320 knutprefdlg.cpp:396 #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Color de fondo :" # knutprefdlg.cpp:66 #: knutprefdlg.cpp:710 msgid "Use dialog \"Are you sure\"" msgstr "Usar diálogo \"¿Estás seguro?\"" # knutprefdlg.cpp:70 #: knutprefdlg.cpp:712 msgid "Use Main window when program is started" msgstr "Mostrar ventana principal cuando el programa se inicie" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "" # knutvardata.cpp:41 #: knutprefdlg.cpp:715 #, fuzzy msgid "No" msgstr "Nada" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "Auto" # knutprefdlg.cpp:70 #: knutprefdlg.cpp:718 msgid "Show message window, when program reports error" msgstr "Mostrar ventana de mensaje, cuando el programa de un error" # knutprefdlg.cpp:50 #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Voltaje/Frecuencia" # knutprefdlg.cpp:75 #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Voltaje de entrada Nominal" # knutprefdlg.cpp:78 #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&220 V" # knutprefdlg.cpp:79 #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 V" # knutprefdlg.cpp:81 #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Frecuencia de entrada nominal" # knutprefdlg.cpp:84 #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Hz" # knutprefdlg.cpp:85 #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Hz" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "" # knutprefdlg.cpp:153 #: knutprefdlg.cpp:770 msgid "UPS" msgstr "SAI" # knutprefdlg.cpp:153 #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "Configuración SAI" # knutprefdlg.cpp:171 #: knutprefdlg.cpp:792 msgid "&Add" msgstr "&Añadir" # knutdock.cpp:412 #: knutprefdlg.cpp:793 #, fuzzy msgid "&Edit" msgstr "&Salir" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "" # knutprefdlg.cpp:189 #: knutprefdlg.cpp:813 msgid "Dock bar" msgstr "Barra de anclaje" # knutprefdlg.cpp:189 #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "Configuración del icono de sistema" # knutprefdlg.cpp:192 #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "Tipo de icono de sistema" # knutprefdlg.cpp:197 #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Objetos del mensaje emergente" # knutprefdlg.cpp:205 #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Figura" # knutprefdlg.cpp:206 #: knutprefdlg.cpp:832 msgid "&General" msgstr "&General" # knutprefdlg.cpp:209 knutprefdlg.cpp:301 #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "F&abricante" # knutprefdlg.cpp:212 knutprefdlg.cpp:304 #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "M&odelo" # knutprefdlg.cpp:215 knutprefdlg.cpp:307 #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "Nº de &Serie" # knutprefdlg.cpp:218 knutprefdlg.cpp:310 #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "&Firm. rev." # knutprefdlg.cpp:221 knutprefdlg.cpp:313 #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "En E&jecución" # knutprefdlg.cpp:224 #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "Carga de &Batería" # knutprefdlg.cpp:227 #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "&SAI Carga" # knutprefdlg.cpp:231 #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Usar color personalizado de fondo de los iconos" # knutprefdlg.cpp:234 #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Color de fondo de los iconos :" # knutprefdlg.cpp:273 #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Panel" # knutprefdlg.cpp:273 #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Configuración del panel" # knutprefdlg.cpp:286 #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "SAI &Sobrecarga" # knutprefdlg.cpp:289 #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "SAI &Batería baja" # knutprefdlg.cpp:292 #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "R&emplaza batería" # knutprefdlg.cpp:295 #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "&Calibración del SAI" # knutprefdlg.cpp:298 #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "Fabricante + &Modelo" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "" # knutprefdlg.cpp:353 #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Configuración de Fuentes" # knutprefdlg.cpp:360 #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "&Utilizar fuente personalizada" # knutprefdlg.cpp:365 #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Panel principal" # knutprefdlg.cpp:366 #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Panel analógico" # knutprefdlg.cpp:388 #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Analógico" # knutprefdlg.cpp:388 #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Configuración del panel analógico" # knutprefdlg.cpp:398 #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Usar otros colores personalizados" # knutprefdlg.cpp:400 #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Color del puntero:" # knutprefdlg.cpp:402 #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Color del limite OK:" # knutprefdlg.cpp:404 #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Color del limite de aviso:" # knutprefdlg.cpp:406 #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Color del limite de error:" # knutprefdlg.cpp:408 #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Color de la escala:" # knutprefdlg.cpp:410 #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Color de la fuente :" # knutprefdlg.cpp:400 #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "Procesamiento digital de los punteros:" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "Nada se esta procesando" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "Antialiasing rápido" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "Antialiasing bueno" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "Antialiasing rápido y blur motion" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "Antialiasing bueno y blur motion" # knutprintupsvar.cpp:50 #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "Variables del SAI" # knutprintupsvar.cpp:48 #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Recargar Variables" # knutprintupsvar.cpp:76 #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Valor" # knutprintupsvar.cpp:78 #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Descripción" # knutprintupsvar.cpp:97 knutprintupsvar.cpp:99 knutprintupsvar.cpp:102 #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Comandos Instantáneos" # knutprintupsvar.cpp:118 knutprintupsvar.cpp:120 knutprintupsvar.cpp:123 #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Variables de Lectura/Escritura" # knutprintupsvar.cpp:152 knutprintupsvar.cpp:154 knutprintupsvar.cpp:157 #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Variables de Solo Lectura" # knutrwvar.cpp:56 #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "DEFINIR VARIABLE DE LECT/ESCR." # knutrwvar.cpp:61 #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Variable:" # knutrwvar.cpp:64 #: knutrwvar.cpp:58 msgid "Value:" msgstr "Valor:" # knutvardata.cpp:41 #: knutvardata.cpp:63 msgid "None" msgstr "Nada" # knutvardata.cpp:42 #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Voltaje de Entrada" # knutvardata.cpp:44 #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "Temperatura del SAI" # knutvardata.cpp:45 #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Frecuencia de Entrada" # knutvardata.cpp:47 #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "Temperatura Exterior" # knutvardata.cpp:48 #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Humedad Exterior" # knutvardata.cpp:49 #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Voltaje de la Batería" # knutvardata.cpp:50 #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Voltaje de Salida" # knutvardata.cpp:51 #: knutvardata.cpp:73 msgid "Output Current" msgstr "Salida Actual" # knutvardata.cpp:45 #: knutvardata.cpp:74 msgid "Output Frequency" msgstr "Frecuencia de Salida" # knutvardata.cpp:52 #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Temperatura de la Batería" # knutvardata.cpp:53 #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Batería Actual" # knutvardata.cpp:51 #: knutvardata.cpp:77 #, fuzzy msgid "Input Current" msgstr "Salida Actual" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "" # knutvardata.cpp:170 #: knutvardata.cpp:209 msgid "No memory." msgstr "Sin memoria." # knutvardata.cpp:171 #: knutvardata.cpp:210 msgid "No address." msgstr "Sin dirección." # knutvardata.cpp:172 #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Dirección desconocida." #: knutvardata.cpp:214 msgid "Error of connection." msgstr "Error de conexión." #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "" # knutvardata.cpp:177 #: knutvardata.cpp:220 msgid "No connection with server." msgstr "Sin conectar al servidor." # knutvardata.cpp:179 #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Protocolo cliente-servidor o las variables del NUT son desconocidas." # knutvardata.cpp:180 #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "No hay SAI en esa dirección." # knutvardata.cpp:177 #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "La conexión fue rechazada por el servidor." # knutvardata.cpp:181 #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "El Servidor no recibe datos." # knutvardata.cpp:182 #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "El Servidor no envía datos." # knutvardata.cpp:183 #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "El Servidor no responde." # knutvardata.cpp:185 #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "El Servidor devuelve datos con un formato desconocido." # knutvardata.cpp:186 #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "El Servidor devuelve datos desconocidos." # knutvardata.cpp:187 #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "El comando VER devuelve datos con un formato desconocido." # knutvardata.cpp:190 #: knutvardata.cpp:234 msgid "No data." msgstr "Sin datos." # knutvardata.cpp:196 #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Acceso denegado. Contraseña erronea ?" # knutvardata.cpp:197 #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "SAI no envía datos al servidor (Datos perdidos)." # knutvardata.cpp:198 #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "El servidor no conoce este comando." # knutvardata.cpp:201 #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "El driver del SAI no está conectado." # knutvardata.cpp:203 #: knutvardata.cpp:245 msgid "Server required password." msgstr "Servidor requiere contraseña." # knutvardata.cpp:204 #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Contraseña incorrecta." # knutvardata.cpp:205 #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "SAI no responde." # knutvardata.cpp:206 #: knutvardata.cpp:248 msgid "Command failed." msgstr "Comando fallido." # knutvardata.cpp:207 #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "SAI no conoce este comando instantáneo." # knutvardata.cpp:208 #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "SAI no soporta este comando instantáneo." # knutvardata.cpp:209 #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "SAI no conoce esta variable." # knutvardata.cpp:210 #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "SAI no soporta esta variable." # knutvardata.cpp:211 #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "SAI no soporta este valor en esta variable." # knutvardata.cpp:212 #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "Nombre desconocido del SAI." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "El nombre de usuario ya ha sido introducido." #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "La contraseña ya ha sido introducida." # knutvardata.cpp:182 #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "El Servidor no envía la lista de variables." # knutvardata.cpp:215 #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Erro dessconocido." # main.cpp:31 #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Cliente para Network UPS Tool" # main.cpp:47 #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "" #: main.cpp:41 msgid "Daniel Prynych" msgstr "" #: main.cpp:43 msgid "Arnaud Quette" msgstr "" #: main.cpp:44 msgid "MGE" msgstr "" # main.cpp:37 #: main.cpp:48 #, fuzzy msgid "Don't dock in SysTray" msgstr "Sin icono en Kicker" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "" # knutprefdlg.cpp:42 #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 #, fuzzy msgid "&Settings" msgstr "Configuración" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "&Conexión" # knutinstcomms.cpp:56 knutnewupsdlg.cpp:95 knutrwvar.cpp:70 #: rc.cpp:10 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Nombre de usuario:" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" # knutprefdlg.cpp:62 knutprefdlg.cpp:320 knutprefdlg.cpp:396 #, fuzzy #~ msgid "color of the background" #~ msgstr "Color de fondo :" # knutprefdlg.cpp:62 knutprefdlg.cpp:320 knutprefdlg.cpp:396 #, fuzzy #~ msgid "color of the foreground" #~ msgstr "Color de fondo :" # knutprefdlg.cpp:58 knutprefdlg.cpp:317 knutprefdlg.cpp:394 #, fuzzy #~ msgid "Background color:" #~ msgstr "Usar color de fondo personalizado" # knutprefdlg.cpp:58 knutprefdlg.cpp:317 knutprefdlg.cpp:394 #, fuzzy #~ msgid "Choose a new background color" #~ msgstr "Usar color de fondo personalizado" # knutprefdlg.cpp:53 #~ msgid "&Use High-Low XFER" #~ msgstr "&Usar Alto-Bajo XFER" # _translatorinfo.cpp:1 #~ msgid "" #~ "_: NAME OF TRANSLATORS\n" #~ "Your names" #~ msgstr "Mad-Soft" # _translatorinfo.cpp:3 #~ msgid "" #~ "_: EMAIL OF TRANSLATORS\n" #~ "Your emails" #~ msgstr "mad.soft@gmail.com" # knutclient.cpp:328 #~ msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" #~ msgstr "upsd > 1.2 no soporta UDP. La conexión se ha cambiado a TCP" # knutnewupsdlg.cpp:35 #~ msgid "New Ups" #~ msgstr "Nuevo SAI" # knutprintupsvar.cpp:41 #~ msgid "Variables" #~ msgstr "Variables" # knutrwvar.cpp:40 #~ msgid "RW variables" #~ msgstr "Variables de Lect/Escr." knc105/po/pl.po0000644000175000017500000004771412073503741011555 0ustar dandan# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Tomasz Walach , 2010. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2010-03-13 11:12+0100\n" "Last-Translator: Tomasz Walach \n" "Language-Team: pl \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: knutclient.cpp:94 msgid "Ready." msgstr "Gotowy." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "Błąd połączenia. Następne połączenie będzie za %1 sek." #: knutclient.cpp:481 msgid "Data OK" msgstr "Dane poprawne" #: knutclient.cpp:576 msgid "UPS is off." msgstr "UPS jest wyłączony." #: knutclient.cpp:579 msgid "UPS is back on." msgstr "UPS jest włączony." #: knutclient.cpp:584 msgid "Power is back online." msgstr "Przywrócono zasilanie." #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "UPS na zasilaniu z akumulatora(ów)." #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "Akumulator(y) UPS'a na wyczerpaniu." #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "Akumulator(y) UPS'a w porządku." #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "Akumulator UPS'a jest uszkodzony i wymaga wymiany." #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "UPS jest przeciążony." #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "UPS nie jest przeciążony." #: knutclient.cpp:615 msgid "UPS is performing calibration." msgstr "Kalibracja ustawień UPS'a." #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "Kalibracja UPS'a zakończona." #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "UPS zwiększa napięcie wejściowe." #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "Zwiększanie napięcia przez UPS zakończone." #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "UPS obniża napięcie wejściowe." #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "Obniżanie napięcia przez UPS zakończone." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "Połączenie odnowione." #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "Połączenie zamknięte przez drugą stronę (upsd)." #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Przełączony" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "Połącz ponownie" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "Czy jesteś pewien ?" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Nazwa" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "Nazwa UPS'a" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "Adres UPS'a" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Status : " #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "Połączenie nie istnieje." #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "UPS zasilanie sieciowe" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "UPS zasilanie akumulatorowe" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "UPS odłączony od zasilania sieciowego" #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "UPS niski poziom akumulatora(ów)" #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Wymień akumulator(y)" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "Kalibracja ustawień UPS'a" #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "UPS jest przeciążony" #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "UPS obniża napięcie" #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "UPS podwyższa napięcie" #: knutdock.cpp:461 msgid "Error : " msgstr "Błąd : " #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Producent : " #: knutdock.cpp:468 msgid "Serial" msgstr "Oznaczenie" #: knutdock.cpp:470 msgid "Firmware" msgstr "Firmware" #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "Czas pracy" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 min" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Naładowanie akumulatora" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "Obciążenie UPS'a" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "Do&stępne zmienne i polecenia UPS'a" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "U&ruchomienie poleceń" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "Ustawienie zmiennych R&W" #: knutdock.cpp:623 msgid "&Preferences" msgstr "&Ustawienia" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "&O KNutClient" #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Minimalizuj" #: knutdock.cpp:629 msgid "&Exit" msgstr "&Zakończ" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "UPS przeciążenie" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "UPS niski poziom akumulatora(ów)" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "UPS kalibracja" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "Nr seryjny : " #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Wersja Firmware : " #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Polecenia" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "Wykonaj polecenie" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Polecenie:" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "Nazwa użytkownika:" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Hasło:" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "test połączenia za 5" #: knutmainwindow.cpp:699 msgid "UPS Label" msgstr "UPS Etykieta" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "UPS ComboBox" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Zakończ" #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "&Stosuj opisy" #: knutmainwindow.cpp:753 msgid "Reconnect the application" msgstr "Połącz ponownie program" #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Opóźnienie (ms):" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Port:" #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "Zapisz hasło NUT'a w pliku konfiguracyjnym" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "Dostępne zmienne UPS'a" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "Wybrane zmienne UPS'a" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "UPS Zmienne" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Brak nazwy lub adresu UPS'a" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "Nazwa istnieje" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "Opóźnienie musi być liczbą" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "Port musi być liczbą" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "Numer portu musi być z przedziału 1025 do 65535" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "Wartość opóźnienia jest za mała" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Preferencje" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Ustawienia" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Główne ustawiania" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Liczba kolumn :" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Stosuj wybrany kolor tła" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Kolor tła :" #: knutprefdlg.cpp:710 msgid "Use dialog \"Are you sure\"" msgstr "Stosuj dialog \"Czy jesteś pewien\"" #: knutprefdlg.cpp:712 msgid "Use Main window when program is started" msgstr "Wyświetl Główne okno po uruchomieniu" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "Tak" #: knutprefdlg.cpp:715 msgid "No" msgstr "Nie" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "Automatycznie" #: knutprefdlg.cpp:718 msgid "Show message window, when program reports error" msgstr "Pokaż okno wiadomości, gdy program zgłasza błędy" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Napięcie/Częstotliwość" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Nominalne napięcie wejściowe" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&230 V" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 V" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Nominalna częstotliwość wejściowa" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Hz" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Hz" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "&Zastosuj High-Low wartości dla wejściowego transferu" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "UPS" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "Ustawienia UPS'a" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "Dod&aj" #: knutprefdlg.cpp:793 msgid "&Edit" msgstr "&Edycja" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "&Kasuj" #: knutprefdlg.cpp:813 msgid "Dock bar" msgstr "Tacka" #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "Ustawienia tacki systemowej" #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "Typ prezentacji w tace systemowej" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Informacje w dymku" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Graficzna" #: knutprefdlg.cpp:832 msgid "&General" msgstr "&Opisowa" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "P&roducent" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "M&odel" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "Nr &seryjny" #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "Wersja &Firmware" #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "Czas p&racy" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "&Naładowanie akumulatora" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "Obciążenie &UPS'a" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Stosuj kolor tła ikon" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Kolor tła ikony :" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Panel" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Ustawienia panela" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "UPS &przeciążenie" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "UPS &niski poziom akumulatora(ów)" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "&Wymień akumulator(y)" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "UPS &kalibracja " #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "Producent + &Model" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "Czcionki" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Ustawienia czcionek" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "&Stosuj czcionki użytkownika" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Panel główny" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Panel analogowy" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Analogowy" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Ustawienia panelu analogowego" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Stosuj inne kolory użytkownika" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Kolor wskaźnika :" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Kolor prawidłowego zakresu :" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Kolor ostrzegawczego zakresu :" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Kolor zakresu nieprawidłowego :" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Kolor podziałki :" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Kolor czcionki :" #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "Obróbka cyfrowa wskaźnika :" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "Nic nie obrabiaj" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "Szybki antyaliasing" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "Dokładny antyaliasing" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "Szybki antyaliasing i rozmycie" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "Dokładny antyaliasing i rozmycie" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "Zmienne UPS'a" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Przeładuj zmienne" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Wartość" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Opis" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Polecenia " #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Odczyt/zapis zmiennych" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Zmienne tylko do odczytu" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "USTAW ZMIENNĄ RW" #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Zmienna:" #: knutrwvar.cpp:58 msgid "Value:" msgstr "Wartość:" #: knutvardata.cpp:63 msgid "None" msgstr "Nic" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Napięcie wejściowe" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "Temperatura UPS'a" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Częstotliwość wejściowa" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "Temperatura zewnętrzna" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Wilgotność zewnętrzna" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Napięcie akumulatora(ów)" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Napięcie wyjściowe" #: knutvardata.cpp:73 msgid "Output Current" msgstr "Prąd wyjściowy" #: knutvardata.cpp:74 msgid "Output Frequency" msgstr "Częstotliwość wyjściowa" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Temperatura akumulatora(ów)" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Prąd akumulatora(ów)" #: knutvardata.cpp:77 msgid "Input Current" msgstr "Prąd wejściowy" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "UPS Moc" #: knutvardata.cpp:209 msgid "No memory." msgstr "Brak pamięci." #: knutvardata.cpp:210 msgid "No address." msgstr "Brak adresu." #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Nieznany adres." #: knutvardata.cpp:214 msgid "Error of connection." msgstr "Błąd połączenia." #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "Błąd sieci, prawdopodobnie odłączony przewód sieciowy." #: knutvardata.cpp:220 msgid "No connection with server." msgstr "Brak połączenia z serwerem." #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Protokół serwer-klient lub zmienne NUT'a są niezrozumiałe." #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "Brak UPS'a pod tym adresem." #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "Połączenie odrzucone przez serwer." #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "Serwer nie przyjmuje danych." #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "Serwer nie wysyła danych." #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "Serwer nie odpowiada." #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "Serwer zwrócił dane w nieznanym formacie." #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "Serwer zwrócił nieznane dane." #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "Polecenie VER zwraca dane w nieznanym formacie." #: knutvardata.cpp:234 msgid "No data." msgstr "Brak danych." #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Brak dostępu. Błędne hasło ?" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "UPS nie przesyła danych do serwera (Dane nieaktualne)." #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "Serwer nie zna tego polecenia." #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "Sterownik UPS'a nie jest podłączony." #: knutvardata.cpp:245 msgid "Server required password." msgstr "Serwer wymaga hasła." #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Nieprawidłowe hasło." #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "UPS nie odpowiada." #: knutvardata.cpp:248 msgid "Command failed." msgstr "Polecenie nie wykonane." #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "UPS nie zna tego polecenia." #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "UPS nie wspiera tego polecenia." #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "UPS nie rozpoznaje zmiennej." #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "UPS nie wspiera tej zmiennej." #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "UPS nie wspiera tej wartości zmiennej." #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "Nieznana nazwa UPS'a." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "Nazwa użytkownika była już wprowadzona." #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "Hasło było już wprowadzone." #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "Serwer nie przesyła listy zmiennych." #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Nieznany błąd." #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Klient dla Network UPS Tool" #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 #, fuzzy msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "(C) 2002 - 2010 Daniel Prynych" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "Zajecov, Republika Czeska" #: main.cpp:41 msgid "Daniel Prynych" msgstr "Daniel Prynych" #: main.cpp:43 msgid "Arnaud Quette" msgstr "Arnaud Quette" #: main.cpp:44 msgid "MGE" msgstr "MGE" #: main.cpp:48 msgid "Don't dock in SysTray" msgstr "Nie umieszczaj w tacce systemowej" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "&Plik" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 msgid "&Settings" msgstr "&Ustawienia" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "&Połączenie" #: rc.cpp:10 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Tomasz Walach" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "tomasz_rysz@o2.pl" #~ msgid "color of the background" #~ msgstr "kolor tła" #~ msgid "color of the foreground" #~ msgstr "kolor pierwszoplanowy" #~ msgid "size of a ball" #~ msgstr "rozmiar kuli" #~ msgid "Background color:" #~ msgstr "Kolor tła:" #~ msgid "Choose a new background color" #~ msgstr "Wybór nowego koloru tła" #~ msgid "Project age:" #~ msgstr "Wiek projektu:" #~ msgid "Foreground color:" #~ msgstr "Kolor pierwszoplanowy:" #~ msgid "Choose a new foreground color" #~ msgstr "Wybór nowego koloru pierwszoplanowego" #~ msgid "Set the project age (in days)" #~ msgstr "Ustawienie wieku projektu (w dniach)" #~ msgid "Change the project age (in days) by choosing a new number of days." #~ msgstr "Zmiana wieku projektu (w dniach) przez wybranie nowej liczby dni." knc105/po/ru.po0000644000175000017500000005471112073503741011563 0ustar dandan# translation of ru.po to Russian # Copyright (C) 2003,2004, 2009 Free Software Foundation, Inc. # # Oleg Shevchenko , 2003,2004. # Daniel Prynych , 2003, 2004. # Alexander Sergeev , 2009. msgid "" msgstr "" "Project-Id-Version: ru\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2009-06-25 13:03+1100\n" "Last-Translator: Alexander Sergeev \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: knutclient.cpp:94 msgid "Ready." msgstr "Готов." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "Соединится не удалось. Следующая попытка будет произведена через %1 с." #: knutclient.cpp:481 msgid "Data OK" msgstr "Данные появились." #: knutclient.cpp:576 msgid "UPS is off." msgstr "UPS выкл." #: knutclient.cpp:579 msgid "UPS is back on." msgstr "UPS вкл." #: knutclient.cpp:584 msgid "Power is back online." msgstr "Сеть возвращена." #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "UPS на батарее." #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "Низкий заряд UPS." #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "Заряд UPS в норме." #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "Аккумулятор UPS плохой и требует замены." #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "UPS перегружен." #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "UPS не перегружен." #: knutclient.cpp:615 #, fuzzy msgid "UPS is performing calibration." msgstr "UPS выполняет калибровку" #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "Калибровка UPS завершена." #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "UPS повышет входное напряжение." #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "UPS закончил повышать входное напряжение." #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "UPS понижает входное напряжение." #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "UPS закончил понижать входное напряжение." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "Соединение обновлено." #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "Соединение сброшено серевером upsd." #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Переключено" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "Переподключиться" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "Вы уверенны?" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Имя" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "Имя UPS" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "Адрес UPS" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Статус : " #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "Соединение не установлено." #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "UPS на линии" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "UPS на батарее" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "UPS на линии" #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "Низкий заряд UPS." #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Замените аккумулятор" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "UPS выполняет калибровку" #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "UPS перегружен" #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "UPS понижает напряжение" #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "UPS повышает напряжение" #: knutdock.cpp:461 msgid "Error : " msgstr "Ошибка : " #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Производитель : " #: knutdock.cpp:468 msgid "Serial" msgstr "Номер" #: knutdock.cpp:470 msgid "Firmware" msgstr "Прошивка" #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "Заряда на" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 мин" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Заряд батареи" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "Нагрузка UPS" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "П&оказать переменные и команды UPS" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "Выполнить &прямую команду" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "&Установка и изменение переменных" #: knutdock.cpp:623 msgid "&Preferences" msgstr "Предпочтени&я" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "&О программе KNutClient" #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Свернуть" #: knutdock.cpp:629 msgid "&Exit" msgstr "&Выход" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "Перегрузка UPS" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "Низкий заряд UPS" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "Калибровка UPS" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "Номер : " #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Прошивка : " #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Прямые команды" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "ВЫПОЛНИТЬ ПРЯМУЮ КОМАНДУ" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Команда:" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "Имя пользователя:" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Пароль:" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "" #: knutmainwindow.cpp:699 #, fuzzy msgid "UPS Label" msgstr "Имя UPS" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Выйти из приложения" #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "Использую &описания" #: knutmainwindow.cpp:753 #, fuzzy msgid "Reconnect the application" msgstr "Выйти из приложения" #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Задержка (мс):" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Порт:" #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "Хранить NUT пароль в конфигурационном файле" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "Доступные датчики UPS" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "Выбранные датчики" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "Переменные UPS" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Отсутствует Имя или адрес UPS" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "Такое Имя уже существует" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "Задержка должна быть числовой" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "Порт должен быть числовой" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "Порт должен быть в диапазоне 1025 - 65535" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "Задержка слишком маленькая" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Предпочтения" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Настройки" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Основные настройки" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Количество колонок :" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Использовать выбранный цвет фона" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Цвет фона :" #: knutprefdlg.cpp:710 #, fuzzy msgid "Use dialog \"Are you sure\"" msgstr "Использовать диалог \"Вы уверенны\" :" #: knutprefdlg.cpp:712 #, fuzzy msgid "Use Main window when program is started" msgstr "Использовать главное окно при старте :" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "" #: knutprefdlg.cpp:715 #, fuzzy msgid "No" msgstr "Нет" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "Автоматически" #: knutprefdlg.cpp:718 #, fuzzy msgid "Show message window, when program reports error" msgstr "Использовать главное окно при старте :" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Напряжение/Частота" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Номинальное входное напряжение" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&230 В" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 В" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Номинальная входная частота" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Гц" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Гц" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "UPS" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "Настройки UPS" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "&Добавить" #: knutprefdlg.cpp:793 #, fuzzy msgid "&Edit" msgstr "&Выход" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "" #: knutprefdlg.cpp:813 msgid "Dock bar" msgstr "Трей" #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "Настройки трея" #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "Тип показаний" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Пункты подсказки" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Картина" #: knutprefdlg.cpp:832 msgid "&General" msgstr "&Основной" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "Пр&оизводитель" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "&Модель" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "Серийный но&мер" #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "&Прошивка" #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "&Время работы" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "&Заряд аккумулятора" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "&Нагрузка UPS" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Использовать выбранный цвет фона для иконок" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Цвет фона для иконок:" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Панель" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Настройка панели" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "&Перегрузка UPS" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "Ни&зкимй заряд UPS" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "&Замените батарею" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "&Калибровка UPS" #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "П&роизводитель + Модель" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Настройка шрифтов" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "И&спользовать выбранный шрифт" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Основная панель" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Аналоговая панель" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Аналог" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Настройка аналоговой панели" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Использовать выбранные цвета" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Цвет указателя :" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Цвет нормальной области :" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Цвет области предупреждения :" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Цвет области ошибки:" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Цвет шкалы :" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Цвет шрифта :" #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "Обработка указателей :" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "Нет" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "Быстрое сглаживание" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "Хорошее сглаживание" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "Быстрое сглаживание и следы" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "Хорошее сглаживание и следы" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "Переменные UPS" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Обновить переменные" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Значение" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Описание" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Прямые команды" #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Изменяемые переменные" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Переменные только для чтения" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "ИЗМЕНЕНИЕ ПЕРЕМЕННЫХ" #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Переменная:" #: knutrwvar.cpp:58 msgid "Value:" msgstr "Значение:" #: knutvardata.cpp:63 msgid "None" msgstr "Нет" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Входное напряжение" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "Температура UPS" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Входная частота" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "Окружающая температура" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Окружающая влажность" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Напряжение аккумулятора" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Выходное напряжение" #: knutvardata.cpp:73 msgid "Output Current" msgstr "Выходной ток" #: knutvardata.cpp:74 #, fuzzy msgid "Output Frequency" msgstr "Входная частота" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Температура аккумулятора" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Ток батареи" #: knutvardata.cpp:77 #, fuzzy msgid "Input Current" msgstr "Выходной ток" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "" #: knutvardata.cpp:209 #, fuzzy msgid "No memory." msgstr "Нет памяти." #: knutvardata.cpp:210 msgid "No address." msgstr "Нет адреса." #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Неизвестный адрес." #: knutvardata.cpp:214 msgid "Error of connection." msgstr "Ошибка соединения" #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "" #: knutvardata.cpp:220 #, fuzzy msgid "No connection with server." msgstr "Нет связи с сервером." #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Протокол или переменные для NUT неизвестны." #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "UPS отсутствует на данном адресе." #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "Сервер отказал в соединении." #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "Сервер не принимает данных." #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "Сервер не пересылает данные." #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "Сервер не отвечает." #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "Сервер присылает данные в неизвестном формате." #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "Сервер присылает неизвестные данные." #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "Команда VER возвращает данные в неизвестном формате." #: knutvardata.cpp:234 msgid "No data." msgstr "Нет данных." #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Доступ запрещен. Неправильный пароль ?" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "UPS не пересылает данные на сервер (Данные устаревшие)." #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "Сервер не знает команду." #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "Не могу соединиться с драйвером UPS." #: knutvardata.cpp:245 msgid "Server required password." msgstr "Сервер требует пароль." #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Неправильный пароль." #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "UPS не отвечает." #: knutvardata.cpp:248 msgid "Command failed." msgstr "Неверная команда." #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "UPS не знает команду." #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "UPS не поддерживает команду." #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "UPS не знает переменную." #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "UPS не поддерживает переменную." #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "UPS не поддерживает это значение для данной переменной." #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "Имя UPS неизвестное." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "Имя пользователя уже введено." #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "Пароль уже введён." #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "Сервер не присылает список переменных." #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Неизвестная ошибка." #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Клиент для Network UPS Tool" #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "" #: main.cpp:41 msgid "Daniel Prynych" msgstr "" #: main.cpp:43 msgid "Arnaud Quette" msgstr "" #: main.cpp:44 msgid "MGE" msgstr "" #: main.cpp:48 #, fuzzy msgid "Don't dock in SysTray" msgstr "Не сворачиваться в трей Kicker." #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 #, fuzzy msgid "&Settings" msgstr "Настройки" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "&Соединение" #: rc.cpp:10 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Имя пользователя:" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #~ msgid "" #~ "_: NAME OF TRANSLATORS\n" #~ "Your names" #~ msgstr "Oleg Shevchenko, Alexander Sergeev" #~ msgid "" #~ "_: EMAIL OF TRANSLATORS\n" #~ "Your emails" #~ msgstr "oleg@kpgaz.chernigov.ua, etc90@mail.ru" #~ msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" #~ msgstr "upsd > 1.2 не поддерживает UDP. Соединение переключено на TCP" #~ msgid "New Ups" #~ msgstr "Новый UPS" #~ msgid "&Use High-Low XFER" #~ msgstr "&Использовать напряжение перехода UPS" #~ msgid "Variables" #~ msgstr "Переменные" #~ msgid "RW variables" #~ msgstr "Изменяемые переменные" knc105/po/it.po0000644000175000017500000005055112073503741011547 0ustar dandan# translation of it.po to # Daniel Prynych , 2003, 2008. # Vincenzo Reale , 2013. msgid "" msgstr "" "Project-Id-Version: it\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2013-01-01 12:56+0100\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: knutclient.cpp:94 msgid "Ready." msgstr "Pronto." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "" "La connessione non è riuscita.La prossima connessione avverrà dopo %1 sec." #: knutclient.cpp:481 msgid "Data OK" msgstr "Dati OK" #: knutclient.cpp:576 msgid "UPS is off." msgstr "L'UPS è spento." #: knutclient.cpp:579 msgid "UPS is back on." msgstr "L'UPS è tornato in linea." #: knutclient.cpp:584 msgid "Power is back online." msgstr "Power è tornato in linea." #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "L'UPS è in modalità batteria." #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "La batteria dell'UPS è scarica." #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "Batteria UPS è carica" #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "L'UPS ha le batterie rovinate, è consigliabile sostituirle." #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "L'UPS è in sovraccarico." #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "L'UPS non è in sovraccarico." #: knutclient.cpp:615 msgid "UPS is performing calibration." msgstr "L'UPS sta eseguendo la calibrazione." #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "La calibrazione dell'UPS è terminata." #: knutclient.cpp:623 #, fuzzy msgid "UPS is boosting incoming voltage." msgstr "UPS sta prendendo la tensione in entrata." #: knutclient.cpp:626 #, fuzzy msgid "Boosting of UPS is ended." msgstr "UPS ha finito." #: knutclient.cpp:631 #, fuzzy msgid "UPS is trimming incoming voltage." msgstr "UPS is trimming incoming voltage." #: knutclient.cpp:634 #, fuzzy msgid "Trimming of UPS is ended." msgstr "Trimming of UPS is ended." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "La connessione è stata rinnovata." #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "La connessione è stata chiusa dall'altro lato (upsd)." #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Commutato" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "Riconnetti" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "Sei sicuro?" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Nome" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "Nome UPS" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "Indirizzo UPS" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Stato : " #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "La connessione non esiste." #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "UPS in linea" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "UPS in modalità batteria" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "UPS non in linea" #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "Batteria UPS scarica" #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Sostituisci le batterie" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "L'UPS sta eseguendo la calibrazione" #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "UPS in sovraccarico" #: knutdock.cpp:452 #, fuzzy msgid "UPS is trimming voltage" msgstr "UPS is trimming voltage" #: knutdock.cpp:455 #, fuzzy msgid "UPS is boosting voltage" msgstr "Calibrazione UPS" #: knutdock.cpp:461 msgid "Error : " msgstr "Errore : " #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Produttore: " #: knutdock.cpp:468 msgid "Serial" msgstr "Numero di serie" #: knutdock.cpp:470 msgid "Firmware" msgstr "Firmware" #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "Autonomia" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 min" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Carica batterie" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "Carico UPS" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "Mo&strare variabili e comandi dell'UPS" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "Esecu&zione comandi istantanei" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "Impostazione variabili RW" #: knutdock.cpp:623 msgid "&Preferences" msgstr "&Preferenze" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "Inform&azioni su KNutClient" #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Minimizza" #: knutdock.cpp:629 msgid "&Exit" msgstr "&Esci" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "Sovraccarico UPS" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "Batteria UPS scarica" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "Calibrazione UPS" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "Numero di serie: " #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Revisione firmware: " #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Comandi istantanei" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "Avvio comando istantaneo" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Comando:" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "User name:" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Password:" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "test di connessione dal 5" #: knutmainwindow.cpp:699 msgid "UPS Label" msgstr "Etichetta UPS" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "UPS ComboBox" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Chiude l'applicazione" #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "&Utilizza le descrizioni" #: knutmainwindow.cpp:753 msgid "Reconnect the application" msgstr "Riconnetti l'applicazione" #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Ritardo (ms):" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Porta:" #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "Registra password di NUT nel file di configurazione" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "Valori UPS a disposizione" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "Valori UPS selezionati" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "Variabili UPS" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Nessun nome o indirizzo UPS" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "Questo nome esiste" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "Il ritardo deve essere un numero" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "La porta deve essere un numero" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "La porta deve essere scelta tra 1025 e 65535" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "Il ritardo è troppo piccolo" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Preferenze" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Impostazioni" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Impostazioni principali" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Numero di colonne:" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Colore di sfondo personalizzato" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Colore di sfondo:" #: knutprefdlg.cpp:710 msgid "Use dialog \"Are you sure\"" msgstr "Utilizza la finestra \"Sei sicuro\"" #: knutprefdlg.cpp:712 msgid "Use Main window when program is started" msgstr "Utilizza la schermata principale quando il programma viene avviato" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "Sì" #: knutprefdlg.cpp:715 msgid "No" msgstr "No" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "Auto" #: knutprefdlg.cpp:718 msgid "Show message window, when program reports error" msgstr "Apri una finestra di dialogo, quando il programma segnala errori" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Tensione/Frequenza" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Tensione di ingresso nominale" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&230 V" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 V" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Frequenza di ingresso nominale" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Hz" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Hz" #: knutprefdlg.cpp:752 #, fuzzy msgid "&Use High-Low input.transfer values" msgstr "&Utilizzare High-Low input.transfer valori" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "UPS" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "Impostazioni UPS" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "&Aggiungi" #: knutprefdlg.cpp:793 msgid "&Edit" msgstr "Mo&difica" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "&Elimina" #: knutprefdlg.cpp:813 #, fuzzy msgid "Dock bar" msgstr "Barra di aggancio" #: knutprefdlg.cpp:814 #, fuzzy msgid "Docking Setting" msgstr "Impostazioni dell'area di aggancio" #: knutprefdlg.cpp:820 #, fuzzy msgid "Type of dock's showing" msgstr "Tipo di visualizzazione dell'area di aggancio" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Elementi del suggerimento" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Immagine" #: knutprefdlg.cpp:832 msgid "&General" msgstr "&Generale" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "Prod&uttore" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "&Modello" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "Numero di &serie" #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "Revisione &firmware" #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "Au&tonomia" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "Carica delle &batterie" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "Carico dell'&UPS" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Utilizza un colore personalizzato per lo sfondo dell'icona" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Colore di sfondo dell'icona:" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Pannello" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Impostazioni del pannello" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "UPS s&ovraccarico" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "UPS &Batterie scariche" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "Sostituisci l&e batterie" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "&Calibrazione UPS" #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "Produttore + &modello" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "Caratteri" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Impostazione dei caratteri" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "&Utilizza un carattere personalizzato" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Pannello principale" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Pannelli analogici" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Analogico" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Impostazioni pannello analogico" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Utilizza altri colori personalizzati" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Colore dell'indicatore:" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Colore dell'intervallo di OK:" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Colore dell'intervallo di avviso:" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Colore dell'intervallo di errore:" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Colore della scala:" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Colore del carattere:" #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "Elaborazione digitale degli indicatori:" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "Nessuna elaborazione" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "Antialiasing rapido" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "Antialiasing preciso" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "Antialiasing rapido e sfocatura del movimento" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "Antialiasing preciso e sfocatura del movimento" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "Variabili dell'UPS" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Ricarica variabili" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Valore" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Descrizione" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Comandi istantanei" #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Variabili di lettura/scrittura" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Variabili di sola lettura" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "Imposta variabile RW" #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Variabile:" #: knutrwvar.cpp:58 msgid "Value:" msgstr "Valore:" #: knutvardata.cpp:63 msgid "None" msgstr "Nessuno" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Tensione di ingresso" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "Temperatura dell'UPS" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Frequenza di ingresso" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "Temperatura esterna" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Umidità esterna" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Tensione delle batterie" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Tensione in uscita" #: knutvardata.cpp:73 msgid "Output Current" msgstr "Corrente in uscita" #: knutvardata.cpp:74 msgid "Output Frequency" msgstr "Frequenza di uscita" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Temperatura delle batterie" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Corrente delle batterie" #: knutvardata.cpp:77 msgid "Input Current" msgstr "Corrente in ingresso" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "Potenza dell'UPS" #: knutvardata.cpp:209 msgid "No memory." msgstr "Nessuna memoria." #: knutvardata.cpp:210 msgid "No address." msgstr "Nessun indirizzo." #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Indirizzo sconosciuto." #: knutvardata.cpp:214 msgid "Error of connection." msgstr "Errore di connessione." #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "Errore di rete, forse il cavo è stato scollegato." #: knutvardata.cpp:220 msgid "No connection with server." msgstr "Nessuna connessione al server." #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Il protocollo server-client o le variabili di NUT sono sconosciuti." #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "Nessun UPS a questo indirizzo." #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "La connessione è stata rifiutata dal server." #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "Il server non riceve dati." #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "Il server non invia dati." #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "Il server non risponde." #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "Il server restituisce dati con formato sconosciuto." #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "Il server restituisce dati sconosciuti." #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "Il comando VER restituisce dati con formato sconosciuto." #: knutvardata.cpp:234 msgid "No data." msgstr "Nessun dato." #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Accesso negato. Password sbagliata?" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "L'UPS non riesce a inviare le informazioni al server." #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "Il server non conosce questo comando." #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "Il driver dell'UPS non è connesso." #: knutvardata.cpp:245 msgid "Server required password." msgstr "Il server richiede una password." #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Password non corretta." #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "L'UPS non risponde." #: knutvardata.cpp:248 msgid "Command failed." msgstr "Comando non riuscito." #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "L'UPS non conosce questo comando istantaneo." #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "L'UPS non supporta questo comando istantaneo." #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "L'UPS non conosce questa variabile." #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "L'UPS non supporta questa variabile." #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "L'UPS non supporta tale valore in questa variabile." #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "Il nome dell'UPS è sconosciuto." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "Il nome utente è stato già inserito." #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "La password è stata già inserita." #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "Il server non invia l'elenco delle variabili." #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Errore sconosciuto." #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Client for Network UPS Tool" #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 #, fuzzy msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "(C) 2002 - 2010 Daniel Prynych" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "Zajecov, Repubblica Ceca" #: main.cpp:41 msgid "Daniel Prynych" msgstr "Daniel Prynych" #: main.cpp:43 msgid "Arnaud Quette" msgstr "Arnaud Quette" #: main.cpp:44 msgid "MGE" msgstr "MGE" #: main.cpp:48 msgid "Don't dock in SysTray" msgstr "Non mostrare l'icona nel vassoio di sistema" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "&File" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 msgid "&Settings" msgstr "Impo&stazioni" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "&Connessione" #: rc.cpp:10 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Vincenzo Reale" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "smart2128@baslug.org" #, fuzzy #~ msgid "color of the background" #~ msgstr "Colore di sfondo :" #, fuzzy #~ msgid "color of the foreground" #~ msgstr "Colore di sfondo :" #, fuzzy #~ msgid "Background color:" #~ msgstr "Colore di sfondo custom:" #, fuzzy #~ msgid "Choose a new background color" #~ msgstr "Colore di sfondo custom:" #~ msgid "&Use High-Low XFER" #~ msgstr "&Use High-Low XFER" #~ msgid "" #~ "_: NAME OF TRANSLATORS\n" #~ "Your names" #~ msgstr "Andrea Pesarini" #~ msgid "" #~ "_: EMAIL OF TRANSLATORS\n" #~ "Your emails" #~ msgstr "andreapes72@yahoo.it" #~ msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" #~ msgstr "upsd > 1.2 non supporta UDP. Connessione spostata su TCP" #~ msgid "New Ups" #~ msgstr "Nuovo UPS" #~ msgid "Variables" #~ msgstr "Variabili" #~ msgid "RW variables" #~ msgstr "Variabili RW" knc105/po/de.po0000644000175000017500000004773612073503741011536 0ustar dandan# translation of de.po to # Copyright (C) 2002,2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. # # Christoph Thielecke , 2002,2003, 2004, 2008. # Daniel Prynych , 2003, 2005. # Christoph Thielecke , 2006. msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2008-05-26 07:18+0200\n" "Last-Translator: Christoph Thielecke \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #: knutclient.cpp:94 msgid "Ready." msgstr "Bereit." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "" "Die Verbindung ist fehlgeschlagen. Die nächste Verbindung wir nach %1s " "aufgebaut." #: knutclient.cpp:481 msgid "Data OK" msgstr "Daten OK" #: knutclient.cpp:576 msgid "UPS is off." msgstr "USV ist aus." #: knutclient.cpp:579 msgid "UPS is back on." msgstr "USV wieder an." #: knutclient.cpp:584 msgid "Power is back online." msgstr "Netzspannung ist wieder verfügbar." #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "USV ist im Akkubetrieb." #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "USV hat niedrigeren Akkustand." #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "USV Akkustand ist OK." #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "USV Akku ist in schlechter Verfassung und muss ausgewechselt werden." #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "USV ist überlastet." #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "USV ist nicht überlastet." #: knutclient.cpp:615 #, fuzzy msgid "UPS is performing calibration." msgstr "USV wird gerade kalibriert" #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "Kalibration der USV ist beendet." #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "USV verstärkt eingehende Spannung." #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "Verstärkung der USV ist beendet." #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "USV beschränkt eingehende Spannung." #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "Beschränkung der USV ist beendet." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "Die Verbindung wurde erneuert." #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "Die Verbindung wurde von der anderen Seite (upsd) geschlossen." #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Geschaltet" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "Erneut verbinden" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "Sind Sie Sicher?" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Name" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "Benutzername" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "USV-Adresse" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Status : " #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "Verbindung existiert nicht." #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "USV-Netzbetrieb" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "USV-Akkubetrieb" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "USV offline" #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "USV-Akkustand niedrig" #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Akku ersetzen" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "USV wird gerade kalibriert" #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "USV überlastet" #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "USV beschränkt Spannung" #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "USV erhöht Spannung" #: knutdock.cpp:461 msgid "Error : " msgstr "Fehler :" #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Hersteller: " #: knutdock.cpp:468 msgid "Serial" msgstr "Seriell" #: knutdock.cpp:470 msgid "Firmware" msgstr "Firmware" #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "Laufzeit" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 min" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Akkustand" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "USV-Auslastung" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "USV-Variablen und Kommandos werden ange&zeigt" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "Sofort-Kommandos werden ausge&führt" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "&RW-Variablen werden gesetzt" #: knutdock.cpp:623 msgid "&Preferences" msgstr "&Einstellungen" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "&Über KNutClient" #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Minimieren" #: knutdock.cpp:629 msgid "&Exit" msgstr "&Beenden" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "USV-Überlastung" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "USV niedriger Akkustand" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "USV-Kalibration" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "Seriennr.: " #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Firmw.-Rev.: " #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Sofortkommandos" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "SOFORTKOMMANDO STARTEN" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Kommando:" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "Benutzername:" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Passwort:" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "Test der Verbindung von 5" #: knutmainwindow.cpp:699 #, fuzzy msgid "UPS Label" msgstr "Benutzername" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Beendet das Programm." #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "Beschreibungen werden &verwendet" #: knutmainwindow.cpp:753 #, fuzzy msgid "Reconnect the application" msgstr "Beendet das Programm." #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Verzögerung (ms):" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Port:" #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "NUT-Passwort in Konfigurationsdatei speichern" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "USV-Variablen" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Kein Name oder USV-Adresse" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "Dieser Name existiert bereits" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "Die Verzögerung muss eine Zahl sein" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "Der Port muss eine Zahl sein" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "Der Port muss zwischen 1025 und 65535 liegen" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "Verzögerung ist zu klein" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Einstellungen" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Einstellung" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Haupteinstellung" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Anzahl der Zeilen:" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Benutzerdefinierte Hintergrundfarbe benutzen:" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Hintergrundfarbe:" #: knutprefdlg.cpp:710 msgid "Use dialog \"Are you sure\"" msgstr "\"Sind Sie sicher\"?-Dialog benutzen" #: knutprefdlg.cpp:712 msgid "Use Main window when program is started" msgstr "Wenn Programm gestartet, Hauptfenster benutzen" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "" #: knutprefdlg.cpp:715 #, fuzzy msgid "No" msgstr "Keine" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "" #: knutprefdlg.cpp:718 msgid "Show message window, when program reports error" msgstr "Wenn Programm Fehler meldet, Nachrichtenfenster anzeigen" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Spannung/Frequenz" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Nominelle Eingangsspannung" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&230 V" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 V" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Nominelle Eingangsfrequenz" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Hz" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Hz" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "USV" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "USV-Einstellung" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "&Hinzufügen" #: knutprefdlg.cpp:793 #, fuzzy msgid "&Edit" msgstr "&Beenden" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "" #: knutprefdlg.cpp:813 #, fuzzy msgid "Dock bar" msgstr "Andocken" #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "Einstellung des Docking" #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "Typ der Dockanzeige" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Elemente des Kurztipps" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Bild" #: knutprefdlg.cpp:832 msgid "&General" msgstr "&Allgemein" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "&Hersteller" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "M&odell" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "&Serien-Nr." #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "&Firmw-Rev." #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "&Laufzeit" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "&Akkuladung" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "&USV-Auslastung" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Benutzerdefinierte Hintergrundfarbe für Symbol benutzen" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Hintergrundfarbe des Symbols:" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Kontrollleiste" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Kontrollleisteneinstellung" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "USV-Über&lastung" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "USV niedriger &Batteriestand" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "Akku ers&etzen" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "USV-&Kalibration" #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "Hersteller + &Modell" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Schriftarten einstellen" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "Benutzerdefinierte Schriftart &benutzen" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Hauptkontrollleiste" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Analoge Bedienfläche" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Analog" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Analoges Bedienfeld setzen" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Benutzerdefinierte andere Farben benutzen" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Farbe des Zeigers:" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Farbe des OK-Bereiches:" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Farbe des Warnung-Bereiches:" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Farbe des Fehler-Bereiches:" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Farbe der Skalierung:" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Schriftfarbe:" #: knutprefdlg.cpp:1007 msgid "Digital processing of pointers :" msgstr "Digitalverarbeitung der Zeiger:" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "Keine Verarbeitung" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "Schnelle Kantenglättung" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "Feine Kantenglättung" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "Schnelle Kantenglättung und verschwommene Bewegung" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "Feine Kantenglättung und verschwommene Bewegung" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "USV-Variablen" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Neugeladene Variablen" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Wert:" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Beschreibung" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Sofortkommandos" #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Lesen/Schreiben-Variablen" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Nur lesbare Variablen" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "RW-VARIABLE SETZEN" #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Variable:" #: knutrwvar.cpp:58 msgid "Value:" msgstr "Wert:" #: knutvardata.cpp:63 msgid "None" msgstr "Keine" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Eingangsspannung" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "USV-Temperatur" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Eingangsfrequenz" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "USV-Aussentemperatur" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Aussenfeuchtigkeit" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Akkuspannung" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Ausgangsspannung" #: knutvardata.cpp:73 msgid "Output Current" msgstr "Aktuelle Ausgabe" #: knutvardata.cpp:74 msgid "Output Frequency" msgstr "Ausgangsfrequenz" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Batterietemperatur" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Batterie aktuell" #: knutvardata.cpp:77 #, fuzzy msgid "Input Current" msgstr "Aktuelle Ausgabe" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "" #: knutvardata.cpp:209 #, fuzzy msgid "No memory." msgstr "Kein Speicher." #: knutvardata.cpp:210 msgid "No address." msgstr "Keine Adresse." #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Unbekannte Adresse." #: knutvardata.cpp:214 msgid "Error of connection." msgstr "Fehler bei der Verbindung" #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "" #: knutvardata.cpp:220 msgid "No connection with server." msgstr "Keine Verbindung zum Server." #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Server-Client-Protokoll oder Variablen von NUT unbekannt" #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "Keine USV an dieser Adresse." #: knutvardata.cpp:224 msgid "Connection was refused by server." msgstr "Verbindung wurde vom Server abgelehnt." #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "Der Server emfängt keine Daten." #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "Der Server sendet keine Daten." #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "Der Server antwortet nicht." #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "Server gab Daten in unbekanntem Vormat zurück." #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "Server gab unbekannte Daten zurück." #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "Kommando VER gab Daten in unbekanntem Format zurück." #: knutvardata.cpp:234 msgid "No data." msgstr "Keine Daten." #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Zugriff verweigert. Falsches Passwort?" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "Die USV sendet keine Daten zum Server (Daten gestohlen)." #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "Server kennt dieses Kommando nicht." #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "USV-Treiber ist nicht verbunden." #: knutvardata.cpp:245 msgid "Server required password." msgstr "Server erfordert Passwort." #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Fehlerhaftes Passwort." #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "USV reagiert nicht." #: knutvardata.cpp:248 msgid "Command failed." msgstr "Kammando fehlgeschlagen." #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "USV kennt dieses Sofortkommando nicht." #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "USV unterstützt dieses Sofortkommando nicht." #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "USV kennt diese Variable nicht." #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "USV unterstützt diese Variable nicht." #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "USV unterstützt diese Wert in dieser Variable nicht." #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "Name der USV unbekannt." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "Der Benutzername wurde bereits eingegeben." #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "Das Passwort wurde bereits eingegeben." #: knutvardata.cpp:259 msgid "Server doesn't send list of variables." msgstr "Der Server sendet keine Liste von Variablen." #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Unbekannter Fehler." #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Klient für das Netzwerk-USV-Werkzeug" #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "" #: main.cpp:41 msgid "Daniel Prynych" msgstr "" #: main.cpp:43 msgid "Arnaud Quette" msgstr "" #: main.cpp:44 msgid "MGE" msgstr "" #: main.cpp:48 #, fuzzy msgid "Don't dock in SysTray" msgstr "Nicht ein Kontrollleiste einbinden" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 #, fuzzy msgid "&Settings" msgstr "Einstellung" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "&Verbindung" #: rc.cpp:10 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Benutzername:" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #, fuzzy #~ msgid "color of the background" #~ msgstr "Hintergrundfarbe:" #, fuzzy #~ msgid "color of the foreground" #~ msgstr "Hintergrundfarbe:" #, fuzzy #~ msgid "Background color:" #~ msgstr "Benutzerdefinierte Hintergrundfarbe benutzen:" #, fuzzy #~ msgid "Choose a new background color" #~ msgstr "Benutzerdefinierte Hintergrundfarbe benutzen:" #~ msgid "&Use High-Low XFER" #~ msgstr "Hoch-Niedrig-XFER &benutzen" #~ msgid "" #~ "_: NAME OF TRANSLATORS\n" #~ "Your names" #~ msgstr "Christoph Thielecke" #~ msgid "" #~ "_: EMAIL OF TRANSLATORS\n" #~ "Your emails" #~ msgstr "crissi99@gmx.de" #~ msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" #~ msgstr "upsd > 1.2 unterstützt kien UDP. Verbindung mit TCP geschaltet." #~ msgid "New Ups" #~ msgstr "Neue USV" #~ msgid "Variables" #~ msgstr "Variablen" #~ msgid "RW variables" #~ msgstr "RW-Variablen" knc105/po/uk.po0000644000175000017500000005560612073503741011560 0ustar dandan# translation of uk.po to Czech # translation of uk.po to Russian # translation of ru.po to Russian # Copyright (C) 2003,2004 Free Software Foundation, Inc. # Oleg Shevchenko , 2003,2004. # Daniel Prynych , 2003, 2004. # msgid "" msgstr "" "Project-Id-Version: uk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-10 10:20+0100\n" "PO-Revision-Date: 2004-02-17 19:03+0100\n" "Last-Translator: Daniel Prynych \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0.2\n" #: knutclient.cpp:94 msgid "Ready." msgstr "Готовий." #: knutclient.cpp:163 msgid "The connection failed. The next connection will make after %1 sec." msgstr "" #: knutclient.cpp:481 msgid "Data OK" msgstr "Дані OK" #: knutclient.cpp:576 msgid "UPS is off." msgstr "UPS викл." #: knutclient.cpp:579 msgid "UPS is back on." msgstr "UPS вкл." #: knutclient.cpp:584 msgid "Power is back online." msgstr "Напругу повернуто." #: knutclient.cpp:589 msgid "UPS is on battery." msgstr "UPS на батареї." #: knutclient.cpp:594 msgid "UPS battery is low." msgstr "UPS батарея розряжена." #: knutclient.cpp:597 msgid "UPS battery is OK." msgstr "UPS батарея OK." #: knutclient.cpp:602 msgid "UPS battery is bad and needs be replaced." msgstr "UPS батарея погана і потребує заміни." #: knutclient.cpp:607 msgid "UPS is overloaded." msgstr "UPS перевантажений." #: knutclient.cpp:610 msgid "UPS isn't overloaded." msgstr "UPS не перевантажений." #: knutclient.cpp:615 #, fuzzy msgid "UPS is performing calibration." msgstr "UPS калібровка" #: knutclient.cpp:618 msgid "Calibration of UPS is ended." msgstr "Калібровку UPS закінчено." #: knutclient.cpp:623 msgid "UPS is boosting incoming voltage." msgstr "UPS підняття вхідної напруги." #: knutclient.cpp:626 msgid "Boosting of UPS is ended." msgstr "Підняття напруги закінчено." #: knutclient.cpp:631 msgid "UPS is trimming incoming voltage." msgstr "UPS підстройка вхідної нагруги." #: knutclient.cpp:634 msgid "Trimming of UPS is ended." msgstr "Підстройка вхідної напруги закінчено." #: knutclient.cpp:726 msgid "The connection was renewed." msgstr "" #: knutclient.cpp:793 msgid "The connection was closed by the second side (upsd)." msgstr "" #: knutclient.cpp:869 knutclient.cpp:877 knutclient.cpp:1021 msgid "Switched" msgstr "Переключити" #: knutclient.cpp:1077 knutdock.cpp:621 knutmainwindow.cpp:749 msgid "Reconnect" msgstr "" #: knutclient.cpp:1175 msgid "Are you sure ?" msgstr "Ви впевнені?" #: knutdock.cpp:416 knutdock.cpp:466 knutfrontpanel.cpp:184 #: knutnewupsdlg.cpp:55 knutprintupsvar.cpp:50 msgid "Name" msgstr "Ім'я" #: knutdock.cpp:417 knutnewupsdlg.cpp:71 msgid "UPS name" msgstr "UPS ім'я" #: knutdock.cpp:418 knutnewupsdlg.cpp:64 msgid "UPS address" msgstr "UPS адреса" #: knutdock.cpp:419 knutdock.cpp:440 knutdock.cpp:443 knutdock.cpp:446 #: knutdock.cpp:449 knutdock.cpp:452 knutdock.cpp:455 msgid "Status : " msgstr "Статус : " #: knutdock.cpp:422 knutvardata.cpp:235 msgid "Connection doesn't exist." msgstr "Зв'язок не встановлено." #: knutdock.cpp:426 knutfrontpanel.cpp:70 msgid "UPS On line" msgstr "UPS на лінії" #: knutdock.cpp:430 knutfrontpanel.cpp:83 msgid "UPS On battery" msgstr "UPS на батареї" #: knutdock.cpp:434 msgid "UPS Of line" msgstr "UPS на лінії" #: knutdock.cpp:440 msgid "UPS Battery is low" msgstr "UPS батарея розряжена" #: knutdock.cpp:443 knutfrontpanel.cpp:129 msgid "Replace battery" msgstr "Замінити батарею" #: knutdock.cpp:446 msgid "UPS is performing calibration" msgstr "UPS починаю калібровку" #: knutdock.cpp:449 msgid "UPS is Overload" msgstr "UPS Переватаження" #: knutdock.cpp:452 msgid "UPS is trimming voltage" msgstr "UPS підстройка напруги" #: knutdock.cpp:455 msgid "UPS is boosting voltage" msgstr "UPS підняття напруги" #: knutdock.cpp:461 msgid "Error : " msgstr "Помилка : " #: knutdock.cpp:464 knutfrontpanel.cpp:173 msgid "Manufac. : " msgstr "Виробник : " #: knutdock.cpp:468 msgid "Serial" msgstr "Порт" #: knutdock.cpp:470 msgid "Firmware" msgstr "Firmware" #: knutdock.cpp:474 knutfrontpanel.cpp:221 msgid "Runtime" msgstr "Час роботи" #: knutdock.cpp:474 msgid " : %1:%2 min" msgstr " : %1:%2 мін" #: knutdock.cpp:479 knutvardata.cpp:65 msgid "Battery Charge" msgstr "Зарядка батареї" #: knutdock.cpp:484 knutvardata.cpp:68 msgid "UPS Load" msgstr "UPS Завантаження" #: knutdock.cpp:617 knutmainwindow.cpp:729 msgid "&Showing UPS variables and commands" msgstr "Показа&ти UPS змінні та команди" #: knutdock.cpp:618 knutmainwindow.cpp:733 msgid "&Running instant commands" msgstr "Запуск прями&х команд" #: knutdock.cpp:619 knutmainwindow.cpp:737 msgid "Setting R&W variables" msgstr "Установка змін&них RW" #: knutdock.cpp:623 msgid "&Preferences" msgstr "Перева&ги" #: knutdock.cpp:625 msgid "&About KNutClient" msgstr "П&ро KNutClient" #: knutdock.cpp:627 msgid "&Minimize" msgstr "&Мінімізація" #: knutdock.cpp:629 msgid "&Exit" msgstr "Вихі&д" #: knutfrontpanel.cpp:99 msgid "UPS Overload" msgstr "UPS Переватаження" #: knutfrontpanel.cpp:114 msgid "UPS Battery low" msgstr "UPS Батарея розряжена" #: knutfrontpanel.cpp:144 msgid "UPS calibration" msgstr "UPS калібровка" #: knutfrontpanel.cpp:195 msgid "Serial : " msgstr "Serial : " #: knutfrontpanel.cpp:206 msgid "Firm. rev. : " msgstr "Firm. rev. : " #: knutinstcomms.cpp:35 msgid "Instant commands" msgstr "Прямі команди" #: knutinstcomms.cpp:45 msgid "RUN INSTANT COMMAND" msgstr "ВИКОНАТИ ПРЯМУ КОМАНДУ" #: knutinstcomms.cpp:49 msgid "Command:" msgstr "Команда:" #: knutinstcomms.cpp:53 knutnewupsdlg.cpp:92 knutrwvar.cpp:64 msgid "User name:" msgstr "Ім'я користувача:" #: knutinstcomms.cpp:54 knutnewupsdlg.cpp:99 knutrwvar.cpp:65 msgid "Password:" msgstr "Пароль:" #: knutmainwindow.cpp:51 msgid "test of conection from 5" msgstr "" #: knutmainwindow.cpp:699 #, fuzzy msgid "UPS Label" msgstr "UPS ім'я" #: knutmainwindow.cpp:703 msgid "UPS ComboBox" msgstr "" #: knutmainwindow.cpp:725 msgid "Quits the application" msgstr "Вийти з програми" #: knutmainwindow.cpp:743 msgid "&Using descriptions" msgstr "Вико&ристовую описання" #: knutmainwindow.cpp:753 #, fuzzy msgid "Reconnect the application" msgstr "Вийти з програми" #: knutnewupsdlg.cpp:78 msgid "Delay (ms):" msgstr "Затримка (мс):" #: knutnewupsdlg.cpp:85 msgid "Port:" msgstr "Порт:" #: knutnewupsdlg.cpp:107 msgid "Store NUT password in configuration file" msgstr "Зберігати NUT пароль в конфігураційному файлі" #: knutnewupsdlg.cpp:115 msgid "Availabled UPS values" msgstr "" #: knutnewupsdlg.cpp:116 msgid "Selected UPS values" msgstr "" #: knutnewupsdlg.cpp:124 msgid "UPS Variables" msgstr "UPS змінні" #: knutnewupsdlg.cpp:227 msgid "No Name or UPS address" msgstr "Відсутнє Ім'я або UPS адреса" #: knutnewupsdlg.cpp:235 msgid "This Name exist" msgstr "Таке Ім'я вже існує" #: knutnewupsdlg.cpp:242 msgid "Delay must be number" msgstr "Затримка повинна бути числовою" #: knutnewupsdlg.cpp:248 msgid "Port must be number" msgstr "Порт повинен бути числовим" #: knutnewupsdlg.cpp:253 msgid "Port must be from 1025 until 65535" msgstr "Порт повинен бути в діапазоні 1025 - 65535" #: knutnewupsdlg.cpp:258 msgid "Delay is too small" msgstr "Затримка дуже мала" #: knutprefdlg.cpp:47 msgid "Preferences" msgstr "Переваги" #: knutprefdlg.cpp:693 msgid "Setting" msgstr "Налаштування" #: knutprefdlg.cpp:694 msgid "Main Setting" msgstr "Основні налаштування" #: knutprefdlg.cpp:702 msgid "Number of columns :" msgstr "Кількість стовбчиків :" #: knutprefdlg.cpp:706 knutprefdlg.cpp:906 knutprefdlg.cpp:988 msgid "Use custom background color" msgstr "Використовувати вказаний колір фону" #: knutprefdlg.cpp:708 knutprefdlg.cpp:908 knutprefdlg.cpp:990 msgid "Color of background :" msgstr "Колір фону :" #: knutprefdlg.cpp:710 #, fuzzy msgid "Use dialog \"Are you sure\"" msgstr "Використовувати діалог \"Ви впевнені\" :" #: knutprefdlg.cpp:712 #, fuzzy msgid "Use Main window when program is started" msgstr "Використовувати головне вікно при старті :" #: knutprefdlg.cpp:714 msgid "Yes" msgstr "" #: knutprefdlg.cpp:715 #, fuzzy msgid "No" msgstr "Ні" #: knutprefdlg.cpp:716 msgid "Auto" msgstr "" #: knutprefdlg.cpp:718 #, fuzzy msgid "Show message window, when program reports error" msgstr "Використовувати головне вікно при старті :" #: knutprefdlg.cpp:735 msgid "Voltage/Frequency" msgstr "Напруга/Частота" #: knutprefdlg.cpp:738 msgid "Nominal Input Voltage" msgstr "Номінальна Вхідна Напруга" #: knutprefdlg.cpp:740 msgid "&230 V" msgstr "&230 В" #: knutprefdlg.cpp:741 msgid "&120 V" msgstr "&120 В" #: knutprefdlg.cpp:745 msgid "Nominal Input Frequency" msgstr "Номінальна Вхідна Частота" #: knutprefdlg.cpp:747 msgid "&50 Hz" msgstr "&50 Гц" #: knutprefdlg.cpp:748 msgid "&60 Hz" msgstr "&60 Гц" #: knutprefdlg.cpp:752 msgid "&Use High-Low input.transfer values" msgstr "" #: knutprefdlg.cpp:770 msgid "UPS" msgstr "UPS" #: knutprefdlg.cpp:771 msgid "UPS Setting" msgstr "UPS Налаштування" #: knutprefdlg.cpp:792 msgid "&Add" msgstr "&Додати" #: knutprefdlg.cpp:793 #, fuzzy msgid "&Edit" msgstr "Вихі&д" #: knutprefdlg.cpp:794 msgid "&Delete" msgstr "" #: knutprefdlg.cpp:813 #, fuzzy msgid "Dock bar" msgstr "Dock" #: knutprefdlg.cpp:814 msgid "Docking Setting" msgstr "Dock налаштування" #: knutprefdlg.cpp:820 msgid "Type of dock's showing" msgstr "Тип показаних dock's" #: knutprefdlg.cpp:824 msgid "Items of tooltip" msgstr "Пункти підсказки" #: knutprefdlg.cpp:831 msgid "&Picture" msgstr "&Картина" #: knutprefdlg.cpp:832 msgid "&General" msgstr "&Основний" #: knutprefdlg.cpp:834 knutprefdlg.cpp:899 msgid "M&anufacturer" msgstr "Ви&робник" #: knutprefdlg.cpp:835 knutprefdlg.cpp:900 msgid "M&odel" msgstr "&Модель" #: knutprefdlg.cpp:836 knutprefdlg.cpp:901 msgid "&Serial" msgstr "Пор&т" #: knutprefdlg.cpp:837 knutprefdlg.cpp:902 msgid "&Firm. rev." msgstr "&Firm. rev." #: knutprefdlg.cpp:838 knutprefdlg.cpp:903 msgid "&Runtime" msgstr "&Час роботи" #: knutprefdlg.cpp:839 msgid "&Battery Charge" msgstr "З&арядка батареї" #: knutprefdlg.cpp:840 msgid "&UPS Load" msgstr "UPS &Завантаження" #: knutprefdlg.cpp:842 msgid "Use custom icon's background color" msgstr "Використовувати вказаний колір фону для іконок" #: knutprefdlg.cpp:845 msgid "Color of icon's background :" msgstr "Колір фону для іконок :" #: knutprefdlg.cpp:878 msgid "Panel" msgstr "Панель" #: knutprefdlg.cpp:879 msgid "Panel Setting" msgstr "Налаштування панелі" #: knutprefdlg.cpp:894 msgid "UPS &Overload" msgstr "UPS &Перевантаження" #: knutprefdlg.cpp:895 msgid "UPS &Battery low" msgstr "UPS &Батарея розряжена" #: knutprefdlg.cpp:896 msgid "R&eplace battery" msgstr "&Замінити батарею" #: knutprefdlg.cpp:897 msgid "Ups &calibration" msgstr "UPS &Калібровка" #: knutprefdlg.cpp:898 msgid "&Manufac. + Model" msgstr "В&иробник + Модель" #: knutprefdlg.cpp:938 msgid "Fonts" msgstr "" #: knutprefdlg.cpp:939 msgid "Setting Fonts" msgstr "Налаштування шрифтів" #: knutprefdlg.cpp:946 msgid "&Use custom font" msgstr "В&икористовувати вказаний шрифт" #: knutprefdlg.cpp:953 msgid "Main panel" msgstr "Основна панель" #: knutprefdlg.cpp:954 msgid "Analog panels" msgstr "Аналогова панель" #: knutprefdlg.cpp:977 msgid "Analog" msgstr "Аналог" #: knutprefdlg.cpp:978 msgid "Setting Analog panel" msgstr "Налаштування аналогової панелі" #: knutprefdlg.cpp:992 msgid "Use custom other colors" msgstr "Використовувати вказані кольори" #: knutprefdlg.cpp:994 msgid "Color of pointer :" msgstr "Колір крапки :" #: knutprefdlg.cpp:996 msgid "Color of OK range :" msgstr "Колір області OK :" #: knutprefdlg.cpp:998 msgid "Color of warning range :" msgstr "Колір області попередження :" #: knutprefdlg.cpp:1000 msgid "Color of error range :" msgstr "Колір області Помилка:" #: knutprefdlg.cpp:1002 msgid "Color of scale :" msgstr "Колір масштабу :" #: knutprefdlg.cpp:1004 msgid "Color of font :" msgstr "Колір шрифту :" #: knutprefdlg.cpp:1007 #, fuzzy msgid "Digital processing of pointers :" msgstr "Колір крапки :" #: knutprefdlg.cpp:1032 msgid "Nothing processing" msgstr "" #: knutprefdlg.cpp:1033 msgid "Fast antialiasing" msgstr "" #: knutprefdlg.cpp:1034 msgid "Fine antialiasing" msgstr "" #: knutprefdlg.cpp:1035 msgid "Fast antialiasing and blur motion" msgstr "" #: knutprefdlg.cpp:1036 msgid "Fine antialiasing and blur motion" msgstr "" #: knutprintupsvar.cpp:41 knutrwvar.cpp:40 msgid "UPS variables" msgstr "UPS змінні" #: knutprintupsvar.cpp:43 knutrwvar.cpp:42 msgid "Reload Vars" msgstr "Перечитати змінні" #: knutprintupsvar.cpp:50 msgid "Value" msgstr "Значенння" #: knutprintupsvar.cpp:54 msgid "Description" msgstr "Описанння" #: knutprintupsvar.cpp:78 msgid "Instant Commands" msgstr "Прямі команди" #: knutprintupsvar.cpp:92 msgid "Read/Write Variables" msgstr "Змінні R/W" #: knutprintupsvar.cpp:114 msgid "Read Only Variables" msgstr "Змінні R/O" #: knutrwvar.cpp:50 msgid "SET RW VARIABLE" msgstr "УСТАНОВКА ЗМІННИХ RW" #: knutrwvar.cpp:55 msgid "Variable:" msgstr "Змінна:" #: knutrwvar.cpp:58 msgid "Value:" msgstr "Значення:" #: knutvardata.cpp:63 msgid "None" msgstr "Ні" #: knutvardata.cpp:64 msgid "Input Voltage" msgstr "Вхідна напруга" #: knutvardata.cpp:66 msgid "UPS Temperature" msgstr "UPS Температура" #: knutvardata.cpp:67 msgid "Input Frequency" msgstr "Вхідная частота" #: knutvardata.cpp:69 msgid "Outside Temperature" msgstr "Навколишня температура" #: knutvardata.cpp:70 msgid "Outside Humidity" msgstr "Навколишня вологість" #: knutvardata.cpp:71 msgid "Battery Voltage" msgstr "Напруга батареї" #: knutvardata.cpp:72 msgid "Output Voltage" msgstr "Вихідна напруга" #: knutvardata.cpp:73 msgid "Output Current" msgstr "Вихідне поточне" #: knutvardata.cpp:74 #, fuzzy msgid "Output Frequency" msgstr "Вхідная частота" #: knutvardata.cpp:75 msgid "Battery Temperature" msgstr "Температура батареї" #: knutvardata.cpp:76 msgid "Battery Current" msgstr "Батарея поточна" #: knutvardata.cpp:77 #, fuzzy msgid "Input Current" msgstr "Вихідне поточне" #: knutvardata.cpp:78 msgid "UPS Power" msgstr "" #: knutvardata.cpp:209 #, fuzzy msgid "No memory." msgstr "Недостатньо пам'яті." #: knutvardata.cpp:210 msgid "No address." msgstr "Адрес відсутній." #: knutvardata.cpp:211 msgid "Unknown address." msgstr "Невідомий адрес." #: knutvardata.cpp:214 msgid "Error of connection." msgstr "" #: knutvardata.cpp:217 msgid "Network error, maybe net cable was plugged out." msgstr "" #: knutvardata.cpp:220 #, fuzzy msgid "No connection with server." msgstr "Зв'язок із сервером відсутній." #: knutvardata.cpp:222 msgid "Server-client protocol or variables of NUT are unknown." msgstr "Сервер-клієнт протокол або змінні для NUT невідомі." #: knutvardata.cpp:223 msgid "No UPS on this address." msgstr "UPS відсутній на даному адресі." #: knutvardata.cpp:224 #, fuzzy msgid "Connection was refused by server." msgstr "Зв'язок із сервером відсутній." #: knutvardata.cpp:226 msgid "Server doesn't receive data." msgstr "Сервер не приймає данні." #: knutvardata.cpp:227 msgid "Server doesn't send data." msgstr "Сервер не пересилає дані." #: knutvardata.cpp:228 msgid "Server doesn't answer." msgstr "Сервер не відповідає." #: knutvardata.cpp:230 msgid "Server returns data with unknown format." msgstr "Сервер повертає данні в невідомому форматі." #: knutvardata.cpp:231 msgid "Server returns unknown data." msgstr "Сервер повертає невідомі данні." #: knutvardata.cpp:232 msgid "Command VER returns data with unknown format." msgstr "Команда VER повертає данні в невідомому форматі." #: knutvardata.cpp:234 msgid "No data." msgstr "Дані відсутні." #: knutvardata.cpp:238 msgid "Access denied. Failed password ?" msgstr "Доступ заборонено. Невірний пароль ?" #: knutvardata.cpp:239 msgid "UPS doesn't sent data to server (Data Stale)." msgstr "UPS не пересилає дані на сервер (Дані застарілі)." #: knutvardata.cpp:240 msgid "Server doesn't know this command." msgstr "Сервер не знає команду." #: knutvardata.cpp:243 msgid "UPS's driver isn't connected." msgstr "UPS не можу приєднатися до драйверу." #: knutvardata.cpp:245 msgid "Server required password." msgstr "Сервер потребує пароль." #: knutvardata.cpp:246 msgid "Incorrect password." msgstr "Невірний пароль." #: knutvardata.cpp:247 msgid "UPS doesn't response." msgstr "UPS не відповідає." #: knutvardata.cpp:248 msgid "Command failed." msgstr "Невірна команда." #: knutvardata.cpp:249 msgid "UPS doesn't know this instant command." msgstr "UPS не знає таку команду." #: knutvardata.cpp:250 msgid "UPS doesn't support this instant command." msgstr "UPS не підтримує команду." #: knutvardata.cpp:251 msgid "UPS doesn't known this variable." msgstr "UPS не знає таку змінну." #: knutvardata.cpp:252 msgid "UPS doesn't support this variable." msgstr "UPS не підтримує змінну." #: knutvardata.cpp:253 msgid "UPS doesn't support this value in this variable." msgstr "UPS не підтримує таке значення для даної змінної." #: knutvardata.cpp:254 msgid "Name of UPS is unknown." msgstr "Ім'я UPS невідоме." #: knutvardata.cpp:256 msgid "Username has been already entered." msgstr "" #: knutvardata.cpp:257 msgid "Password has been already entered." msgstr "" #: knutvardata.cpp:259 #, fuzzy msgid "Server doesn't send list of variables." msgstr "Сервер не пересилає дані." #: knutvardata.cpp:262 msgid "Unknown error." msgstr "Невідома помилка." #: main.cpp:31 msgid "Client for Network UPS Tool" msgstr "Клієнт для Network UPS Tool" #: main.cpp:37 msgid "KNutClient" msgstr "KNutClient" #: main.cpp:38 msgid "(C) 2002 - 2013 Daniel Prynych" msgstr "" #: main.cpp:39 msgid "Zajecov, Czech Republic" msgstr "" #: main.cpp:41 msgid "Daniel Prynych" msgstr "" #: main.cpp:43 msgid "Arnaud Quette" msgstr "" #: main.cpp:44 msgid "MGE" msgstr "" #: main.cpp:48 #, fuzzy msgid "Don't dock in SysTray" msgstr "Відсутній dock при ударі" #. i18n: file: knutclientui.rc:4 #. i18n: ectx: Menu (file) #: rc.cpp:3 msgid "&File" msgstr "" #. i18n: file: knutclientui.rc:9 #. i18n: ectx: Menu (settings) #: rc.cpp:6 #, fuzzy msgid "&Settings" msgstr "Налаштування" #. i18n: file: knutclientui.rc:13 #. i18n: ectx: Menu (connection) #: rc.cpp:9 msgid "&Connection" msgstr "" #: rc.cpp:10 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Ім'я користувача:" #: rc.cpp:11 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" #, fuzzy #~ msgid "color of the background" #~ msgstr "Колір фону :" #, fuzzy #~ msgid "color of the foreground" #~ msgstr "Колір фону :" #, fuzzy #~ msgid "Background color:" #~ msgstr "Використовувати вказаний колір фону" #, fuzzy #~ msgid "Choose a new background color" #~ msgstr "Використовувати вказаний колір фону" #~ msgid "&Use High-Low XFER" #~ msgstr "&Використовувати Високий Низький XFER" #~ msgid "" #~ "_: NAME OF TRANSLATORS\n" #~ "Your names" #~ msgstr "Oleg Shevchenko" #~ msgid "" #~ "_: EMAIL OF TRANSLATORS\n" #~ "Your emails" #~ msgstr "oleg@kpgaz.chernigov.ua" #~ msgid "upsd > 1.2 doesn't support UDP. Connection is switched to TCP" #~ msgstr "upsd > 1.2 не підтримуєт UDP. З'єднання переключено на TCP" #~ msgid "New Ups" #~ msgstr "Новий UPS" #~ msgid "Variables" #~ msgstr "Змінні" #~ msgid "RW variables" #~ msgstr "RW змінні" #~ msgid "Toggle the toolbar..." #~ msgstr "Перемикач toolbar..." #~ msgid "Toggle the statusbar..." #~ msgstr "Перемикач статусної стрічки..." #~ msgid "Protocol" #~ msgstr "Протокол" #~ msgid "UDP" #~ msgstr "UDP" #~ msgid "TCP" #~ msgstr "TCP" #~ msgid "KNutRWVar" #~ msgstr "KNutRWVar" #~ msgid "KNutNet" #~ msgstr "KNutNet" #~ msgid "KNutFrontPanel" #~ msgstr "KNutFrontPanel" #~ msgid "KNutMainWindow" #~ msgstr "KNutMainWindow" #~ msgid "KAnalog" #~ msgstr "KAnalog" #~ msgid "KNutNewUpsDlg" #~ msgstr "KNutNewUpsDlg" #~ msgid "KNutPrefDlg" #~ msgstr "KNutPrefDlg" #~ msgid "KNutPrintUpsVar" #~ msgstr "KNutPrintUpsVar" #, fuzzy #~ msgid "Unknown Error" #~ msgstr "Невідома помилка." #~ msgid "Showing UPS variables and commands" #~ msgstr "Показати UPS змінні та команди" #~ msgid "Running instant commands" #~ msgstr "Запуск прямих команд" #~ msgid "Setting RW variables" #~ msgstr "Установка змінних RW" #~ msgid "Name : " #~ msgstr "Ім'я : " #~ msgid "Runtime : " #~ msgstr "Час работи : " #~ msgid "Name:" #~ msgstr "Ім'я:" knc105/knutclient.notifyrc0000644000175000017500000000503412073504127014107 0ustar dandan[Global] IconName=knutclient Comment=KNutClient Comment[cs]=KNutClient Comment[de]=KNutClient Comment[es]=KNutClient Comment[fr]=KNutClient Comment[it]=KNutClient Comment[ja]=KNutClient Comment[pl]=KNutClient Comment[pt]=KNutClient Comment[pt_BR]=KNutClient Comment[ru]=KNutClient Comment[zh_CN]=KNutClient Comment[zh_TW]=KNutClient [Context/general] Name=General [Event/ok_event] Name=OkEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup [Event/error_event] Name=ErrorEvent Sound=KDE-Sys-App-Error.ogg Action=Sound|Popup [Event/errorConn_event] Name=ErrorConnEvent Sound=KDE-Sys-App-Error.ogg Action=Sound|Popup [Event/connRenewed_event] Name=ConnRenewedEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup [Event/connClosedSecondSide_event] Name=ConnClosedSecondSideEvent Sound=KDE-Sys-App-Error.ogg Action=Sound|Popup [Event/upsOff_event] Name=ErrorConnEvent default_sound=KDE-Sys-App-Error.ogg Action=Sound|Popup [Event/upsBack_event] Name=ErrorConnEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup [Event/powerBack_event] Name=ErrorConnEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup [Event/upsOnBatt_event] Name=UpsOnBattEvent Sound=KDE_Dialog_Appear.ogg Action=Sound|Popup [Event/battLow_event] Name=BattLowEvent Sound=KDE-Sys-App-Error-Critical.ogg Action=Sound|Popup [Event/battOK_event] Name=BattOKEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup [Event/battRep_event] Name=BattRepEvent Sound=KDE-Sys-App-Negative.ogg Action=Sound|Popup [Event/overOn_event] Name=OverOnEvent Sound=KDE-Sys-App-Negative.ogg Action=Sound|Popup [Event/overOff_event] Name=OverOffEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup [Event/calOn_event] Name=CalOnEvent Sound=KDE-Sys-App-Negative.ogg Action=Sound|Popup [Event/calOff_event] Name=CalOffEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup [Event/boostOn_event] Name=BoostOnEvent Sound=KDE-Sys-App-Negative.ogg Action=Sound|Popup [Event/boostOff_event] Name=BoostOffEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup [Event/trimOn_event] Name=TrimOnEvent Sound=KDE-Sys-App-Negative.ogg Action=Sound|Popup Event/trimOff_event] Name=TrimOffEvent Sound=KDE-Sys-App-Positive.ogg Action=Sound|Popup Event/notConnection_event] Name=NotConnectionEvent Sound=KDE-Sys-App-Error.ogg Action=Sound|Popup Event/errorShowVars_event] Name=ErrorShowVarsEvent Sound=KDE-Sys-App-Error.ogg Action=Sound|Popup Event/rwerrors_event] Name=RWErrorsEvent Sound=KDE-Sys-App-Error.ogg Action=Sound|Popup Event/icerrors_event] Name=ICErrorsEvent Sound=KDE-Sys-App-Error.ogg Action=Sound|Popup knc105/build/0000755000175000017500000000000012073504127011245 5ustar dandanknc105/TODO0000644000175000017500000000000012073504127010624 0ustar dandanknc105/doc/0000755000175000017500000000000012073504127010713 5ustar dandanknc105/doc/CMakeLists.txt0000644000175000017500000000005211436654001013447 0ustar dandanadd_subdirectory(cs) add_subdirectory(en) knc105/doc/cs/0000755000175000017500000000000012073504127011320 5ustar dandanknc105/doc/cs/index.docbook0000644000175000017500000010733312073253560014002 0ustar dandan KNutClient'> ]> Příručka pro &knutclient; Daniel Prynych
Daniel@prynych.cz
2001 2002 2003 2004 2006 2007 2008 2009 2010 2011 2012 2013 Daniel Prynych &FDLNotice; 09/12/2010 0.13.05 &knutclient; je grafická klientská aplikace pro UPS systém NUT. Tento dokument popisuje aplikaci &knutclient; verze 1.0.5 KDE kdeutils KNutClient NUT UPS
Úvod &knutclient; je program který umožňuje sledovat stav UPS-ek systému NUT. Použití &knutclient; Hlavní okno aplikace &knutclient; &knutclient; je klientská grafická aplikace pro systém NUT "Network UPS Tools". Umožňuje sledovat stav UPS-ek a zobrazovat hodnoty proměnných které vybraná UPS-ka a její ovladač podporuje. Od verze 0.6.0 &knutclient; podporuje spouštění okamžitých příkazů, a možnost změny RW proměnných. Od verze 0.9.0 nepodporuje &knutclient; protokol UDP. Hlavní okno aplikace &knutclient; Hlavní okno programu je rozděleno na dvě části. Levé část "Hlavní panel" obsahuje následující údaje indikující stav vybrané UPS-ky. Provoz na síť, provoz na baterie, přetížení, nutnost vyměnit baterii, vybití baterie, kalibraci baterie, údaj o dobu běhu po odpojení sítě (RUNTIME) a pod. Déle jsou zde neměnné údaje, to jsou údaje které se za provozu nemění a jsou proto přečteny jen jednou při výběru UPS-ky, například jméno UPS-ky, její sériové číslo, výrobce a pod. Pravá část obsahuje analogové panely (měřáky), které udávají hodnotu proměnných veličin jako je vstupní napětí, zatížení UPS-ky, kapacitu baterie, teplotu UPS-ky, napětí baterie apod. &knutclient; obsahuje nástrojovou lištu (toolbar) ze standardními tlačítky a tlačítko pro výběr sledované UPS-ky. &knutclient; a panel KDE &knutclient; a panel KDE Od verze 0.8.0 &knutclient; dokuje v panelu KDE. Jeho icona je proměnná a zobrazuje informace o zatížení UPS, runtime a a kapacitě baterie, podle toho který typ icony je vybrán. Po přesunu ukazatele myši na ikonu se zobrazí informační okno "ToolTip" které obsahuje více informací o UPS, Nazev, Jméno, Adresu, Stav, Runtime ... Více o vlastnostech &knutclient; Pro spojení se serverovou části NUT-u (upsd) používá &knutclient; protokol, TCP.Po vybraní UPS-ky v nástrojové liště se &knutclient; pokusí přečíst data, pokud se mu to nepodaří, pokus opakuje a to maximálně 2 krát. &knutclient; poté čte data v pravidelných intervalech. Při prvním čtení čte všechny vybrané proměnné, v dalších již jen proměnné které zobrazují analogové panely, RUNTIME a stav UPS-ky. Proměnné zobrazující jméno UPS-ky, výrobce, sériové číslo a pod se tedy čtou jen jednou protože se nepředpokládá jejich změna. Novější verze upsd (od verze 1.3), již nepodporují protokol UDP. Chyby vznikající za běhu programu se zobrazují ve stavové lište. Do stavové lišty je vnořen seznam (ComboBox), ktery obsahuje hlašení chyb, a to včetne datumu, času a nazvy UPS-ky. Maximální délka seznamu je 50 řádek. Chyby vznikající jako odezva na činnost uživatele jsou zobrazeny ve zvláštním okně. Popis příkazů Hlavní okno aplikace &knutclient; Menu Soubor Soubor Zobrazení Ups proměnných a příkazů Vypíše Ups proměnné pro zvolenou UPS-ku Soubor Spuštění okamžitých příkazů Provede na UPS daný okamžitý příkaz Soubor Nastavení UPS RW proměnných Provede změnu UPS RW proměnné Ctrlq Soubor Ukončit Ukončí činnost programu Menu Spojení F1 Spojení Obnovit Spojeni Obnoví spojení s UPS serverem (upsd). Menu Nastavení Nastavení Zobrazovat nástrojovou lištu Zapne/Vypne zobrazení nástrojové lišty (Toolbar) Nastavení Zobrazovat stavovou lištu Zapne/Vypne zobrazování nástrojové lišty Nastavení Nastavení klávesových zkratek... Otevře konfigurační dialog pro přiřazení klávesy k akci. Nastavení Nastavit &knutclient; Otevře hlavni konfigurační dialog Nastavení Použít popis Zapne/Vypne používání popisů u zobrazení UPS proměnných a příkazů. Icona v panelu KDE Menu icony v KDE panelu Menu UPS Slouží pro výběr UPS-ky Zobrazení Ups proměnných a příkazů Vypíše Ups proměnné pro zvolenou UPS-ku Spuštění okamžitých příkazů Provede na UPS daný okamžitý příkaz Nastavení UPS RW proměnných Provede změnu UPS RW proměnné Obnovit Spojeni Obnoví spojení s UPS serverem (upsd) Nastavení Nastavit &knutclient; Aktivuje konfigurační dialog O aplikaci &knutclient; Zobrazí informace o aplikaci &knutclient; Minimalizovat Zavře hlavní okno Konec Ukončí činnost programu Zobrazení proměnných Toto okno zobrazý seznam všech proměnných a okamžitých příkazů, které existují pro zvolenou UPS-ku. Okno proměnných a okamžitých příkazů Okamžité příkazy Okamžité příkazy jsou vykonávány přímo na na UPS-ce, NUT server předává požadavek na příkaz příslušnému ovladači (driveru) a ten pak příkaz vyvolá na UPS-ce. Okno pro ovládaní Vám nabízí ty příkazy, které příslušný ovladač (driver) podporuje. OK Tlačítko OK provede vybraný příkaz. Zrušit Tlačítko zrušit zavře okno. Příkaz Zde je možno vybrat příkaz který je pak následně vykonán Uživatelsky měnitelné (RW) proměnné Uživatelsky měnitelné (RW) proměnné jsou skupinou proměnných které muže měnit přímo uživatel, většina z nich je přímo ekvivalentní nastavení příslušné UPS-ky. Uživatelsky měnitelné proměnné jsou dvojího typu znakové (CHAR) a výčtové (ENUM). Znakové proměnné jsou prostý řetězec znaků o definované maximální délce. Výčtové proměnné je seznam povolených hodnot na které muže být proměnná nastavená. Uživatelsky měnitelné proměnná není změněna na serveru NUT-u (upsd) ale sever pouze dá příslušnému ovladači (driveru) příkaz ke změně, ten ihned provede změnu nastavení UPS-ky. Tato činnost není okamžitá a může trvat i několik sekund. OK Tlačítkem OK je změna proměnné provedena. Zrušit Tlačítkem Zrušit je okno zavřeno. Implicitní Tlačítkem Implicitní mužeme obnovit současnou hodnotu proměnné. Proměnná Zde je možno vybrat proměnnou která bude změněna Hodnota Zde je možno u znakové proměnné zadat, nebo u výčtové proměnné vybrat její hodnotu. Nabídkové pole se automaticky mění podle typu proměnné. Nastavení aplikace &knutclient; Okno pro nastavení má pět částí Nastavení, UPS, Panel Písma a Analog. Nastavení Část NASTAVENÍ slouží pro nastavení počtu sloupců analogových panelů, barvy pozadí hlavního okna, vstupního výstupního napětí (120/230)V, vstupní a výstupní frekvence (50/60)Hz a povolení použití hodnot input.transfer (input.transfer.low a input.transfer.high) &knutclient; Počet sloupců Určuje maximální počet sloupců pro analogové panely Použít vlastní barvu pozadí Dovoluje zvolit vlastní barvu pozadí pro základní okno. Barva pozadí Umožňuje zvolit barvu pozadí Použít dialog "Jste si jistý" Při aktivaci, se při ukončení programu objeví dialog "Jste si jistý" který vyžaduje potvrzení, jinak se program neukončí. Použít hlavní okno když program startuje Nastaví zobrazení hlavního okna při startu programu. Zobrazit okno zpráv, když program hlásí chybu. Povoli zobrazení okna zpráv, kde je zobrazen popis chyby. Má význam jen, když není zakázáno dokování programu. Vstupní napětí Umožňuje vybrat vstupní (výstupní) napětí 230/120V. Položka nemá význam pokud je zároveň zvolena položka Použít input.transfer hodnoty . Vstupní (výstupní) frekvence Umožňuje vybrat vstupní (výstupní) frekvenci 50/60Hz. Položka nemá význam pokud je zároveň zvolena položka Použít High-Low input.transfer hodnoty. Použít input.transfer hodnoty Nastaví vstupní napětí a vstupní frekvenci na základě hodnot v proměnných NUT-u input.transfer.low (LOWXFER) a input.transfer.high (HIGHXFER). Tyto proměnné udávají rozpětí hodnot vstupního napětí, které muže UPS-ka ještě bezpečně zpracovat. Na základě těchto hodnot &knutclient; nastaví napětí a frekvence pro panely které je používají. Například vstupní napětí, výstupní napětí, vstupní frekvence, výstupní frekvence apod. UPS Část UPS slouží pro nastavení seznamu UPS-ek a jejich parametrů. Levá část obsahuje seznam UPS-ek. Pravá část tlačítka pro přidávání, změnu parametrů a smazání záznamu o UPS-kách. &knutclient; Přidat Přidá do seznamu další UPS-ku a nastaví její parametry. Úpravy Změní parametry vybrané UPS-ky Smazat Smaže UPS-ku v seznamu Nastavení parametrů Toto okno slouží k nastavení parametrů UPS-ky. Název Určuje jméno UPS-ky pro program &knutclient; Adresa UPS Určuje adresu počítače ke kterému je UPS připojena. Tedy adresu UPS v síti. Příklad : ns.alo.cz, localhost, 192.168.1.12. Jméno UPS Určuje jméno UPS tak jak je definuje NUT. Pokud není ups definováno, je automaticky použita první ups v seznamu systému NUT daného pc. To platí jen za předpokladu že minimalní verze upsd je 1.3. Blíže v dokumentaci k systému NUT. Příklad : victron, myups, apc700 Zpoždění (ms) Určuje interval mezi dvěma přenosy dat (čteni dat) ze systému NUT. Port Nastaví port na který se &knutclient; připojí. Uživatelské jméno Určuje uživatelské jméno (USERNAME) které &knutclient; použije při prokázaní totožnosti uživatele serveru to jest, programu upsd Heslo Určuje heslo (PASSWORD) pro pro prokázaní totožnosti uživatele. Store NUT password in configuration file. Při zvolení této volby bude heslo uloženo do konfiguračního souboru. V konfiguračním souboru je heslo uloženo nezašifrovaně. Pokud nebude tato volba zvolena bude heslo po ukončení programu zapomenuto. UPS Proměnné Umožňuje vybrat proměnné které budou zobrazeny na analogových panelech v pravé části hlavního okna. Parametry Uživatelské jméno a Heslo mají význam jen pri použití okamžitých příkazů a změnách RW proměnných, při sledování stavu UPS-ky není uživatelské jméno a heslo potřebné. Heslo (PASSWORD) a uživatelské jméno (USERNAME) mají své ekvivalenty v systému NUT v souboru upsd.users. Panel Část PANEL slouží pro určení které informační části hlavního panelu budou zobrazené &knutclient; Přetížení Povoluje/zakazuje zobrazení přetížení. Baterie je vybitá Povoluje/zakazuje zobrazení vybití baterie. Vyměnit baterie Povoluje/zakazuje zobrazení nutnosti výměny baterie. Kalibrace UPS Povoluje/zakazuje zobrazení kalibrace UPS. Výrobce + Model Povoluje/zakazuje zobrazení výrobce a modelu UPS-ky. Výrobce Povoluje/zakazuje zobrazení výrobce UPS-ky. Model Povoluje/zakazuje zobrazení modelu UPS-ky. Sériové č. Povoluje/zakazuje zobrazení sériového čísla UPS-ky. Verze Firmvare Povoluje/zakazuje zobrazení verze firmware UPS-ky. Runtime Povoluje/zakazuje zobrazení doby po kterou je UPS-ka schopna po výpadku napájení dodávat el. proud. Použít vlastní barvu pozadí Dovoluje zvolit vlastní barvu pozadí pro hlavní panel. Barva pozadí Umožňuje zvolit barvu pozadí pro hlavní panel. Písma Část PÍSMA slouží pro výběr používaných písmen. &knutclient; Použít vlastní písma Povoluje/zakazuje možnost vybrat vlastní písma pro Hlavni panel a Analogové panely. Hlavní panel / Analogové panely Určuje pro který panel se bude vybírat písmo. Požadované písmo Vybírá písma pro zadaný typ panelu. Má význam jen tehdy pokud je vybrána položka Použít vlastní písmo. Analog Část Analog slouží pro nastavení barev na analogových panelech. &knutclient; Použít vlastní barvu pozadí Dovoluje zvolit vlastní barvu pozadí pro analogový panel. Barva pozadí Umožňuje zvolit barvu pozadí pro analogový panel. Použít vlastní barvy Dovoluje zvolit vlastní barvy pro následující části analogového panelu. Barva ručičky Umožňuje zvolit barvu ručičky pro analogový panel. Standardní barva je černá. Barva OK rozsahu Umožňuje zvolit barvu podbarvení stupnice pro rozsah správných (OK) hodnot. Standardní barva je zelená. Barva rozsahu varování Umožňuje zvolit barvu podbarvení stupnice pro rozsah varovaní. Standardní barva je žlutá. Barva rozsahu chyby Umožňuje zvolit barvu podbarvení stupnice pro rozsah chyby. Standardní barva je červená. Barva stupnice Umožňuje zvolit barvu stupnice pro analogový panel. Standardní barva je černá. Barva písma Umožňuje zvolit barvu písma pro analogový panel. Standardní barva je černá. Vylepšení zpracování ručičky Umožňuje vybrat grafický způsob zpracování ručičky. Dokovaní Část DOCK slouží pro nastavení parametrů "dokovaní" programu. &knutclient; Typ zobrazení v doku. (Dokem je míněn panel KDE.) Obrázkové Nastavuje obrazkový typ icony. Obrázkové Nastavuje souhrny typ icony, pouze pro specialisty. Prvky ToolTipu. (ToolTipem je míněna "bublinova" napověda.) Výrobce Povoluje/zakazuje zobrazení výrobce UPS-ky. Model Povoluje/zakazuje zobrazení modelu UPS-ky. Sériové č. Povoluje/zakazuje zobrazení sériového čísla UPS-ky. Verze Firmvare Povoluje/zakazuje zobrazení verze firmware UPS-ky. Runtime Povoluje/zakazuje zobrazení doby po kterou je UPS-ka schopna po výpadku napájení dodávat el. proud. Kapacita baterie Povoluje/zakazuje zobrazení kapacity baterie. Zatížení UPS Povoluje/zakazuje zobrazení zatížení UPS. Použít vlastní barvu pozadí Dovoluje zvolit vlastní barvu pozadí pro iconu v KDE panelu, když typ zobrazení icony v panelu je obrázkový. Barva pozadí Umožnuje zvolit barvu pozadí. Otázky a odpovědi &reporting.bugs; &updating.documentation; &knutclient; nepracuje ale program upsc ano. Co mam dělat ? Zkontrolujte nastaveni čísla portu. Od ver. 0.5 (NUT) je změněno číslo portu 3493. Klikněte na odkaz pro další údaje. Credits and License &knutclient; Program copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Daniel Prynych Daniel@prynych.cz Documentation copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Daniel Prynych Daniel@prynych.cz Translations done by: Daniel Prynych Daniel@prynych.cz Čeština &underFDL; &underGPL; Instalace Jak získat &knutclient; &knutclient; není částí KDE projektu http://www.kde.org. &knutclient; může být nalezen na ftp://ftp.buzuluk.cz/pub/alo/knutclient/ Požadavky Pro úspěšné použití &knutclient; potřebujete KDE 4.3.x Seznam změn můžete najít na http://www.knut.prynych.cz. Překlad a instalace Pro překlad a instalaci &knutclient; napište následující příkazy v základním adresáři Vaší &knutclient; aplikace. % cmake ../. -DCMAKE_INSTALL_PREFIX=/usr/ -DCMAKE_BUILD_TYPE=Release % make % make install Od doby kdy KDE aplikace používají cmake nemůžete mít žádné problémy při překladu :-). Jestliže přesto vzniknou nějaké problémy hlaste je prosím do KDE konference. &documentation.index;
knc105/doc/cs/ksetting-cs.png0000644000175000017500000017563311436654001014277 0ustar dandanPNG  IHDRv pHYs&cu"tEXtDescriptionT?da okna: knutclientPX tEXtNzevNastaven UPS ? KNutClient05 IDATx]w|UE?J^$$$  (EAׂTP:vwWQt׊ Ugۢk˪#H/RHڝsgro^=o̙3gfGm ;O>O>UDm~8˃sب,WIJMXeI7eƮ-z Bx .pk(0x w 9TNĆ7JM+JkpU(r_ԲɎX GBKqw2*R4$ EW}&k0͏tRL졀C6,& fPA Yn% BC#um>Mj؍܋𧎩y= Q­ _T2% 咥L*P ؼyw-Qu򊊊vؾf*[J&yWҴ_6oNvyyعsj$E`0![*i&]BA`e/FڱcI Bv?"ӷR75z{  /^p9_]rrssu᧟$V으\vI!]& ̢DLVT񏗝ӯرV F +VxYʣOTJM pm|Nq f)'5k ?o܄u#vGJ|mY mEI(ca/^ɘ\{ 1{L7Ey:VfVW s@)!G8aQpL.Y j ҈D*d}Ow<" EE}~OץkWf;w֯_?77}~G2neԩ/2HQ0*.)^;yܼܼv;'DP n/X}ZJ)'l"Y~glӺ+/ܲE[d@;wE-[9pط@'5?0c;3No٢yCh}5lYpK !Ҧ'd lԪ|@ydiBcRj+#oZo%'֞}Z3/?6șX5G|Pnğ|ɱMQUD:?+Tx+F-v+`GװmXRWjZ91E|5C_=y|Ž[vu,((H&_~}!?YL&6k6䪡7nX,.$c!G͚5r7nذX<f Q$ ?bQ}!RWJ`ute&E_6ojִx6kȣyIEK 2XZOMĺ EE-]ڲ'5od;d:~ƪUkN8D{rz άF(L4zJ'k"?a7pkgyz̙hJ/b<1c>BayKCXd#䬙k`ʕֻwUU>ܵkĴiOweӟ}V,!7JKFv.:N ZT,HWX%VQE柛7o, {ۏ7n:uf@N:>i -tH/9yN 9;BZB,YԵF! 7Bx`Q7sB`QqѲeZhټy_~ ;n3fxnsI~~Yb BlRXZKaIw` PR\s~εWDݺv[ryIIIA,B{Dqknzv O:%ԩSw>v[ff&twKxuQJv2k{Ѿ};֜]Zɚ;w.r>}tRwyRZRRrYg kgK^}yW^uBH6@ओN_֭m~a-/Sp8<| 3gOY[СC8ֶ]gy e1?裉'=?[СôGwвe ǟj$i7? 6lO޽GvgV'ODD 9gϝ;wǎW:bH 4kzh7oO?tQ޴i/:#Ȩh)rt!j]$HðVMǝb]yu&ut|z3b%aRX;hI<|#GZ"XFDyNGȤ;SlN +n^x]x!zۭ{Sj@&` P\Tl;dmڨQcܑ(99`&#$@H@Gyuk>fQ؍ iܸI2l[^glL ƌ3e]3g|nsz[n:V2)`QՄJ C/@0XRRDjJ&@XWԨ!3"D"c2v#G_o>otI%?C;n}Ӧ=ݣGUVΞ=GV޽{|͛{˟CW^|ڵ?jzx_~99s^أ8{=< ^{uB%^z|ƎW5Kf/ecv{޽{wҥWuu ؜[`W_}oY0a_'s9Bb3#?eaϢ^{f0a(?~֔KY3:5 xM_.x>/ `)7: ^7OQkԨѻwoغuf!/(T6Hyqrsss>oz5gdYțo՞y]v{z4MR[t-옫 Jҹs1c32:xW(&LXF>l`7,)E$ ~R&%N\{li֙ky"sbLS`;Csrv#*%,T]S@ 7tVC` -eCP_>L%U. m!Jj66a]8)yW=ÖzGSLM:"Q,3 +M,˲ nu?[I%eo`Q<̋/α,ks3g͚9~\IH2AX),K40a?B :E6|2qذavhѢ={ Y@YzSuV7# 23XEyE8&HZ_ V!?xFiihԹZR:~aÆ}gvGPJ.'ZnmYYfсcxѣG@&'zm}'?ē{7٣'޵ p޹Bڎ۱իG¡pGy0$36[@vvK.{}//_xyg˖_{Gg@V'c֭[3ZF'?0~ǟx~͢['^y}Ll{/Hola6:99ٿ^^~SJgΝЧw/!xmxDTWB"A˭DI7e+^lqʽXo1NƽX?0^,!a7J j_ۨ{m!T(&6mv}ǣI  ;Pľ *$`%{(Sҹ4pBJE_nTqJ֥Ql27cUjF\Ivl&G'n}vJ)+@B @"2u៣Ѵpز gfe߳?@!@|&sW_}uqсW_}mx!`m=&e3C_ ;/NNJ:D(kWUv4sfϙ=g.|ܹsg̘A):t(deTAw,֓!DvV&MNظgqDBzM$drǎLȟnvv}b+V@=m?6[T::hӧOBwqk*L0qIO?-/+{[1 o px?n|^^)7X &L -P?2uJqqqϟ5äa//IZEi2L&X,ǢhEEEM,儯EҲ_y(SpE+*E(bX,Jͣј~V0EX8S)E)LZ,bXLqEo\'x<gx={DvvANgq6CA@H}#&MTRRk;o߿_?qVLÓwԨ[{Gyg ?4h;>Ǐ۷ZڶmlޯHzdܹ---K׮Ç B%Jر~zZ^`M>eKjiOF)+Khge64Ū6!2ď%w EU'8رg-Dyp p坶)+<;8d! S`[CW9@lgA r$Z]IHDfΚ Ňg+;YY(ĕRH&5k҅@gx̬X45HHH(FRT 3ZY@FoVz\1+_ss)+/YQQ3lWp++kZ{bBpFFƒŋ,^ܣGZj+**|S:i:G '/)lF"AwIUX65 27b -$ܝr/ "KU9@skH b%5y-;$B(T+%?ʻJRjev /b +'@[jE(݋ZlN=YI1=`87 ]k6g&@(_&ˆQgl@ x)J}V BP$=xѢ%SϜ**ʅN/p8I,^8E!x}t.GZ*+HI:ԝ NKH7ÖQ|w1e-k$eZU"fDm5n80y{u3Jm%ď0ҶQ&Ѩ*Dv?ᴴN`O>iۦm&M"4h[4ݳg?H!|) +%<23Q,aQV($]>kYPx4jXkBv*ϚjE/7mJZ5k*//O 5;i*!b†m'W1i\P.@/ϟó߲_E E]ƞдˉ灶!#/DD68Ri?sDPeJRlUŭ13D#l7Tj!,#98v;Lk!qN2Q=y|I@_@ӊKuTZ+eQ 7j>JvSI=7v&KXkpsI5jݻ?crt0ˇ㌴fZp[H,B`EXfJ5aB2R]iԛMaYV$V&aXow_dE%[=B@D"5kբJ&5jdD"vŊh^VhW9`ZL@#:9~Wme[sjޖ`h]28Q B_3 ςbޚi\f2z.hB*p *n7wCSN荩\8uaޕ9udu 2di'd&[98-jԬiYI./+ / jz ak6pФfZnBbNaqѺ)TUbfCl(IƞD"H$33+33 3ҏ ˲1R]r?*g}* ZWdo,keH*Gn1,*!T ׂJ $X_Mj(D#^J%D 83v:,{Ǟ•vs-|? ~F޵2y322gOn)D (v)ߒ" q~(AI֞D{;x@()^lr\SidBU؅#"/^TsJ;a)I:qDHvZ$D223!x2ȷ"$WԠMvڬ=nIKg"!ee# ug`0M[ HŢ!)TV(cZ% S'U(F~4Z]j%ɔiz<ꗰA)цD@\udU+IĈtO&TJdc]C!L ,1S J-vˤppr-K,; #q*;&Л:abPjhQĎ0R1/(ٜBpTb(cd!"V1E#'~ <*Vx܈6l1VfQ' a&D G J&E ?pO'PԎ3P Ji8J$R WzQ  ap8OkG:! <PD.,Pp8Z,ة4p q R1vg> [/--M Bx׬Y Sc!*O&`V'RԌ9bs']\RB;y7t29`*:*ŏĤs*>4=%+1j I([OİrPrXɰU:annWI:bsXDGku &r* E^K]P ucX-s]+ή+r$Tߺg֌&R )݋UH!,}AiUD;Rt"!0,q?<.i8Dv ӄsŎ02Tς"Go !lygc(7@<_6Eiex O'Ÿז76&-(w?b6\2b8):">^è!_ *N@.U AE%xJMg"x#.($zZi=Zbv膢D\η'y4:A^,LR9T`\q᪔QXLnA!)c:SjXwޣSȣ˗^ ξdɻ:~ȱAITó0 6nJ _QVs4:O zlgˑe9 > 璨LڜSvJءSqA@ҔTvzQ7:rVLUal",Z'kSE% 9>_ f34ry M5!W2S6Ep=tL@0#kꠂ`OBpB9#kAq^k/hu7%a2Ŷo . 4ז+&UK\l1M>Ak-f_Vyݛ$my9UW y|3`T(EWR UT@)I@GQ&&XJj:J ґRUd~[SP>Dr ϑѓSyTRYG9UceQGT"~kݠWHk\| 9doNf<v/pcoI*gc5SzkJsSj莻P"Zd+1 $H1 1HQ}՜quSIL.{Д(AEP! Y12)BSuhRE%Lu wdJ bPaE: ƻod9ua" %+*STDSQUqJ`$CD#AzoJ A qEbO R #E_p3f[mSS2]-F!LW.p/ȾȀXθpܛRⱏp:j&$񇆬IIJͫ)ѽ(Hca/Z6ujh";{k/7\M YFk>Sܲu&InxL1FRc7#;꜎CN jM[;N_ir .oHk{U5]*JS@ ,\RRD4rBW'UWE~ R{w5Tr A^UOmhk ÒBАm Pى1Uk^0Pn3!%MDUw/ S(,.T<(b k$)(K W΃걧(9skttLp 2r2m-/i%oNݥV%)F2;帋.׸/QElI|A=a%U՗p3QTI*yftMgm ;G{Z E DAh5_n ]fm=U ƣ֭[cbez`9n3m!d*X+x3ͱLmSA G8:5T2D+;ÔcJq>"([{VQ7x?MI(b_$K]dta-ںĀ1p9 Ml%AKɍ(;NVzxjc܆⹲-G*"nb uctuUHB X1` c-H7f%@s,FYE+pKNx@T|0Eˈmo-%?8;/I9aU< M¼yrSwoC%[ơ8bT5ݪa TErpwXij+vc!0B7td~NB*ajjQͺ +pShAfXڪe* o b2=X+p.h^ªtS 7:c2 rW  q+1BM#3jk}~@u%USi~vuc즩q`C XnN;bU:0x*nE<խ/5Um{V=z$Fb_!!2輑Ua!**oPA.dHFY=Vh Fh/@ypVza'pZL^w#`B7vꅖl.ɞ w)0HR7N:,$H6b[ʏ4Tŀ)*wm"[o rI]~ Su]*yd`}\}elM=s\aĸ53+ȮY\V=" UGk!vc7"+覐:>ZT]B%T[~l( $/\W];Z1*qy NT)8=dZbkPl a7LbyabD!Ǽ]L{O)'xp8W'U >'3怘 ]ƶpD:eO#`ep!_|;8V DKjhi)qm:7RF@@7NKp;v<>K 8'3Džnh*ŗWeq q"Ҥȳfem+<?Sn#WTF|=^IʷOEi8B u;`^<|{SyBh]8O }@9~Ȟ61%(ey=qfC&@X)zkuŇz!d2iZ!HtV',&hsi5(V^|.]_Er XVsEW >(r20(% 2ësПK=Ci:E[ FJ |%LnA6m~!{ql+RqHUbC#O)R0d12u3$ <6gJ #P#t 䬅ŹTES) k|r8UwPC1K᫫HFDdT%GpqJ-@L#-m;TK_rbJ)W-/.J5砅t7x*뇚45:"CbR vXll"4JkF*+55tqNXI*ׄG{_\ !D|AO!T#$ LTx'Lv8N'r dWʉ!g08"{bP)cMyHܕf\ A9! -? !@Zr<ѡjTД]P NRT  (33X}TŧT9u00u1XJrY#§L n-i+ Cz psHLKxPs6=4S[MWzeKk^-:1LUQrDZ{>†U|TX M0)L:] l! IcTFta5Q&!-///--FPVV 6YrLʾ%'gKt1U`Q/E6 PX'ع/18Le$9a m&1kZ@'aSk&0U^+3Np)js&Phv IF>PEEŷ ]r… W^tR@AkMW@ӦkZ^rƙD,.NrS^ˢd 1 #HJGR ">+`k);3RrNqP~D}T 4z7E[wVs%m[ s@/8Gjh-YeNC ? k ͲǨ]Xx!KKT<>Ďɠb*:$CyC.C,6##r&B.,Yc…q#*_UPs"t֍y`w RaH=H[(*]5 v" Liz]77`\jS2BڅvQO⶟ IDATN˕UQAN6ĉCQU4lI3-/ԳU2~<Ս*ݕ)9F-[jP(ؾ}è ~7*aSOOΞ_抟߸+ qp9I kѕaR,e-DuW\1s=z W`Cr*S]Oݹ7=mYpVsS];@mnGVX4:1bJa4LZ((ٛ|YF&\0!zWlŴ[qBQ8gޒ_6QZTR+ ؅ik|%Jt$Վg Y!@nj1ɓk0LœP,r##*HGFCa҇4|!#Gꙴub4J+rw\пsf e:vСC;tءSS xQ%zcM[;ء>,+|;N¬YV2]6ض}{:th?c `Q /{nN{瓖Uӥ^_III;߿CұOޓ&Mbd>sƲx1뗕{O5I% TJRľÖ'j U 5YrE.WbFnF7H0%Уҟ* S,ӞQF8R^k$/?.# He˖<+F6;y{[43'wn>kv' iWq]^p+gr,Hӣ4`-3v͚5 ,P?){ -3fo5;\bԩ|n^{ +5p7EL;oO:%'N^֯_n@x^s^|G[_}A|≗_y Zpѣ>aÆIkNx3}+rɒ]s 3{<~M{zڜ9svu;v0aˆ#?/5Ԝٳss:׭a tKN g7E;ߚ2u "A.ZOlذéHGEbqL i0R']UN8깠rb8ݩNF) /aTxv:8 7?PƝny_t# йsgo8(dHFdf?un}3kIYj Š4kANݻwܹs3flmZN /"/ؾ-++ B@]>3z?M6iii A'?%yFLDr5r˨^{m[D{Æ]s͵ͷaÆ_su[obnu;nMDp?OpB)0a6]Q3:,غu "ψ^#H2N-nscm(@e91UF)%.a1B89zPZZZƍ@h_b%eԍhVzn"MNhsRfhyYZtӾ1cF_wu}f~u֖O8FSO;7n2qľ}:"nBz虗1b_׽{ؽk\pBŽ۱up(<C;!d޽S><سgPJsݻwcܹ377‹.5SaM!={FnɴiO hitJQBqbޜրߑzXL"6Oр_aZ^Y!/Vh4e6G> pSHBm zVi~:9 2jRhYYZ_#M6|ߎ'$йsݻϘ1ۿ)S,YݢE!C|ŗڸn׿>$)v /hCXB!W>̟`Ŋ˗X|ҥ˪1|Q^^߷(ݿoV/77 ~0S  v|/A V>`'x;V')/5*c55堌IlK^T(STZRsǎO<1=="욑_)M`ׁ7֯%e iP+TP?#'=Ǘ&"RmۗGNmɥ>+V ҩӭ&RJ !#G9k\˗2uÊܴiS:uZlYO<!C"xO^HSNW&}M:e/˗- ÉDТCPA( "'xA)_yvGJ\]jJ>lp,|3Gt-$eBW[Zdپ O=uꛫj|rujԨQرcGkZjn2JOݴq]7soxr 3KHW?q#Htʡ`(V}u5˿XevxMdiҵJTWKͅ*4cA[)3/kejR2*Vpw7fƷ/EUFpUr~Σ_%%2zT'W{*U> RbϞ=/Ξ ~n^?OoLզc8Q8#-pyn˼HxSJ532z8fco~D4R?/~z٧lYi |>^#g%ʁ^׭Po+ ѣ !B6#Лzx$dBjcL\ݪ1g3]aDD<k׮իW 䧟ChX&ּ4i,-x c&so6pD,\/òxҩY_{xhkTnqX.wa=!5F­YMXRs鑘H}Dbj*LTXiW^wK|6=^|ތȑxǟ{+^u~J P^^O* eEoW~ua&o4>&2uQ>L P7?z !koY쎽Ͼ-圖 x2udeԬ G䞶O>OʬY9s/zS;'Ѳx"J)hX66W'|ɧ㜎,p8OL~ qNЃ:+-,ܻeM}'|:xb Zph55[ڲ%j$5lT'|ɧ㟎,kO>KǾZw7ZŋݚTO>O>؟6 =o6meC_oܸѣI:v>O>.%~ ~K\WF'|ɧL۽Q>ХV'|ɧXK'(O>OGX|'|:"܋M1sģKO>tO>!b}'|鈐G{=ڊO>t؂~眭áZoܻ'|ɧcůXlG/Vg=*O>tbu鑩SU3{.?/^vmL0p޹'4iܤqx>*.po{5lаA½ӧwڵaN8mSCL,W7g=O>;cbO˗/ݻw_lӟ̽Oƫ 3fL*]5dȦͿ̞uƏwlO>oEӷ駟aLdr;vD">#V^ZZ !{9͛!(!C`޼yS̙3&z[FFƈ#`X]w]fs=6ot'|xvIOӟtх~oyVZyAvZ>VuLЫ@Ӧ&\`&ϩWo}mϟ?^z} ;oSunق6h0_H)M&xh+O>۠p8 Iu~}Uߵk׫֧Od2٤q#i71k֬YW_N~; b݄/h4:x`6jk~XED"֭ RBZTT{׮H$-:Tڧ*= z$deeE)SU^3l۷goYNɘ7otM+rՐ!O?= F4O'=_o9{=ܪHadIIiv~|'hޢŚ5k23YUm:FXԩ\fκ\tCҒ%K!N=Inڥ '|ɡX"ZQwV|'|ɧ#B>O>!o|ɛڵk{{,kq͘Qm tBOOV^k+#;< {&R 5!$:.>:H R-TE)( {hJKo~}w?69r$fgwgޛٙAO: ʄX6 ?,(lpe׮]cWڵkg]O9D*AVL5B^c\ߣgs&}{R Ξ۷w_֮Y̎׮^eE O?4Z:+#SZzk+:ԥ+wyxm u?4 Xlݳ|ڵ >zg|W<9`@ ^o``\&=u4Ne[Yzm6g5 cǎNsG"br&LnG~;2bp6=66VT*Xl]xi}q bwQTowP1Q1 ]߿o_xx@ do}ɓvϲ{Ϟ~S";lͶ<=#G~ݳ TL;'w>ʹCT>7=61p̙nJgvbܹs{w~o/]znPݼyǛLEfڙ2eJt/VȖ­[Kg .WԼys%0`!Ddl|OOϺ. BFlzO>2%wJ{?!t^DP-alPܩS.B!G皟kVZ:uQ>RSU2ʦ B!g|V+jVy> _-B!"!m&R#l^REB!ȹBb IXnZI—<=Az !*OԆ٥]v61DJ.e.DTGj jp޼uʟcQvtmNs6JB1**dǩzEt BU4pHx3ve[ߙL&`Wdp0C#BUhBl|ACM@043gڵO!\C  f1B D0 9YiK?Ouif3@x<$+y !PeMkڭ@sA4?n/*z2E .H\b)..3BZBqk4!Z,y0=n!:%sŢ6&`3 Cm`0$'EǛ!}{9K*@aX KS¤Pr]BQEEE-[XEEPOQd͚7mLƭz]}p+TSӧO,!T\~R.,ZW` Tc)I(Y\MӅ~h0>|f1E4]ѡylaF?+؊Wv{2gA!+?>SbSoKڎ G&>5U'SHR jikЬ[l_'A/(qqqK. 9۱1Z\:OkGGEWg8spZdR~(VT @ 'A,h=0NSF EK?X_/YE4EFZt!6mr]x.]fϞi֭7oӧw.[\߾}:tٳgwޱcjld2uޭ{n&֭CaC޾uUVݻsNQQŵ"#\$>xJYf&<3@^4]\\f6نϞ={D.׮\>bm+pb^.\ȞBR͏1vd3ڵѣ̟D"y7~;[M!T {*pH ER{͛7KBlD"5Tzi^LPM6JĶ6e7a ;|$^drVJNN5]X/]'߸~]׳cӳ/^vZϦl߶mԨQAAA}Z/626lUy 0'O\0233G~izU%!4o &|2T n*T&y/X=E'-=Caж]pN]n\noӮ}۶$IMKp8vqtp?G=4tnMMM4k.yoE͋޳T")..޽ܼͦy)erIRi=EJJBL֫W-@V׶GCZb ثWzgupt*WlZ~[JH+qiMuB޽^gO,G ܿkꔩoOXh腋WYǟX._..^wW,_xB9켢Oп[XXXyRNNVV`l)>,.MHG"$'yXf6EKwg''? R)?apH{ .],\ܡ5[hXѣu:ݠA^5˚n{+V'N!`߾}[t ZٸiӦRÆ ͚==rptaS&Oli͚5{W?aPR2[,wc .=|4:e;,P5͉[kP!t#@t`~U Sw-|wyEݞ^X,;w٣X/DbIJJzp~Hhb).zE???F!x|Hx͛Wۏs٢Gή?8q%X$j)W %~q9ZO:, UkPHS@ArHސxʽ{|4j5é9jW R 'GC;"_o޺Q{zy #x"GСCD֥Kp!TT$!g$)˹\D*/ȸrP.G,x{yjR)+j8BamH$BPPzDIrH$D8Y,BUƎHRDb"$I!C, !T\dbFҨUغܹsOfddL0YU}y%G!z\*:#+;'5-}ĉ|uԼyl9ɃBͥj*cyV\QTTTTTr xg+q{!++d2?w[ۥsE5y`|???_&:$<!RBg͛6@ӦMccϙ;Ri¢̌ ٬T*/o](u@\TTXfd-Z}T*lHkmc |)B. |>?*::*:֊;jPMh4c4Bϯvofff._? &Mѻ^e~aPɓuABKX$HP((**r`K2(g:r˛7m!6**jJ& 899jth0L^b44N+xURx;]M7L={t٣{B|dbCbΝ2Sǎύ{ _m>xРАeESz}w]\\\#BSO(5i*.*rss3͕EX-"on۶U$'I_zMVf? -=mݚ%ʔ왳[l9~x~}W\.\pn/xow`ǟT\pd X Tc xT}Gư C3F$ g M`dh>\^4ir=T(T eltχ~~|x&޼yӚ>y weᇘXOOX2wGVp\/SQN{ .KQ4 |40Cz`_jA:sPi-Xy[l޼e+hZo_6V[0MήbMWiԶTnzfV3cah&% PyMS4r9y6X!I (G IyzxZ,バ$'%5CcW_`(Ԕ???HINQ(l:5Be^ijՖ-[=<<*!aahSA^"I+޽G3m% v7Ι3ܹs&)Oq@6}РA+VjsWX>x`6UV۶n3 ?aLJҝ6g_~rRlغoz\0 Sqd1ĺ& )]8\T&S8\; \./9^ʤ.qqƮ_iF޺u{ɒYfTʑ#G9B̜9M_?1y.; =re4yRHhW_ޣӯo .bgabfC11vvy12dž~CYQK/w Mmڶ1 ,KrrrRRRhǎ^^vGIxiiΝkڴi&M\j,x<@(~egw~7]Il[I.WV >ټEVB!MQ !zC+wiDV\n%lBȅ C3Pb .$9 C3 cC"@ܻs[//oP`02y\o?oXl;v{sU Pݠb]A0DJRI_D_P~BQ\G$xh3 )$\0G3G"<SR*)BU0տY !m6LF`0x<^o0z=rfSNvpSN Y?]$]U 9B*(ZUbM&^7LݑEtqqqqqqӦMݻ'e<>E &I$I3(%eB h!^,$) zNiZ0 +ɄBaӦME"QQQQEGw >crJI O jA%B @4{ Ab@@QA4Ms\FEQ # lw%_$xIÇvBUC!I[nݠ\#r8vF"Pu0cvw ήP)'v:f\B=A{;qbrEK.z`#";B1adEsR )++])gϞuwwx'NHNN~ҥ-BRGSpMHub^o4vFT*MMMe{[,Z$&&x?S$==?<<$I&M ?bv'V~B.BNތţF*((b+Bsk;G,}h\R!j\!zFd*,,t \tU=lNN@ >Q i\AUD+X}Vbf/oww. B5 yyyii|˭nt(}pɔ P HzT*0DbM&ME4ͮڙf- 8Ql׉'"##jOBaao?ٔ[eAd2)J/oj6BFV+6h4cؤ۵邂` +BUUqqJy\.άb*K1ZE3ldݶ}{Lt}W{gjŠ#6L]l6L&닊 ZmVVVFFFjjjjjjrձ#/"+%wI۷߾m۷:duoazÛ)y˘͖ZGLݺu->.d29NwZ n~M}zҹ{g6dZhe6WX]'TqՅ+8|Xĥq. }֪Ukk+˗/dӧNG.jՊر3^;xuƐ];wΜ>>(HP88U22]qz8wܞ={:YfSK WVE@ HdkztTBG޵kWxx8ڵOv|_|nݺv0~SN<~#9>n޼`|~S֛ҝ3u7xJ#T\!"˗k4veakVe9y… ۶5;(i IDATФI9QQϫj}}}u___krETuwjPIC1SBL&+b}{틈dl͛[6[sN4믾|R*RT]sN>^!W^0xC!\|ŋ/PUXl%F+X( 333ǃwywmo=v/t6߼ysu.X^׮ݹK/-JHOBWfyݺ0xp5 s?.%{lMͷD_7>k@!rXBx1?/~իW ncx{{pZj*ty䤤'q !\Qv6ujFF|ӷo?:sWoXC!+4GQrΎ2_TTt=;KBȥ5Z]m#GRWO7nl)@%<|k3k!\[Zݻ;W&L0ab΅B`UdnKB5l6y/!s6;y<[%S8$ιB"0XE!jERO0a(2͎8BG P!X,FQ0@vgef Ǜ4!-l,UPXT۶EtŎ3%f-Zܼ~].s9'SBr%!cS`#QXXEQ^4lj,[E!T&fPUR*M&#Üh4U|vd*iͷҡgAz8zL"0zd634xre$d6 alܽk^Lt]ߊڹ{+Zl3 ._Dx1j1?t)1rΥ&^8~䈑˨yQS&OAǥB,MfTmf麾'k4%{zx9|>ܳkįjQeS,K}Zm_m>h0L =ztѣ{BBdd} `d=ΊWۧg۶oc)Zzu}w..B=1ӣǸ_Xh4W@k7r2 ~$7| }|Xxnܸ1ό T ?tŻv6m>s&((HTW[B k֬:pGwYvoܹw,Xn믿~bg>csnܸ11w~+J.[';5!sk4oܸf2I  aJKR ?rXD c`̌#'gw׮^HDS_ަS0+ص{פ`]pW(7~i&MrÇE~>󦍛;iͦDGO{yb8_xzzasO&ώ}C,Bpbazl6M&l,Q(XfMQzJs6Dɿ֮(##_Ǐ!;.[7˘0aw}Ǿ}݄ ovAA;0̙3fh4Z/j|||+99%3 fgg[[effyfLXǰа~jK[BιN-EA$I^JfY@a~T*e[`  ѻύkW 6mX?0rO~DB;js QkS 0m۴c'Ml2/`@P~GROIIQ(M4: j:%% jz. PmqZl `t:]VVֽ{RRRK%%'߻wݻ޽wnRRRRrrrRRrrrJJJZZV5 dVO*fyxzR嗃"a6mƌ{™*,k℉۶m߶mD ۷orWY3b{ \|Vj˖/nZren67W|ŊC#FXtIFFFaaን+g>dX};:&qaWp8>0 &aR)= $IN0$bROc&,=$E\YyϮئO8iɒ:udw9f#gϚm2gt:ݠAfΜ&xuGg+l)S6m+dff6 x4!ꜫXk@@|>}c\.O߾^@ݻw߿L$26]93G  ܕ޶u[Ĝ쬡CdIcɥl 2{&O\&FGEGG=RO%IrԩӦN!dXKh2y<$%I-zED |~k4M7mڲeK6CǏ~T"K$0.b9Ν;w,懏ۆy<ޝ;U_}* B c%j{'64M▭Z_RzǙ"T* A !V*6o|֐_>m@qwsc/Œ$gC,4ZpNK*| D"P(t+kklE*q'8Fi٦۝^o{r BQSma2IJ$pB5B,$V=eddgg[SStQ4M =WAH$jT"U.b)6 3G/FMŒCQTZ:XB:!}&ۯEgA>?q# < F^OӴm(ȊBƑP#5:D"C~;}BAJ4X2iv;ۉ2 CۨӋ@!PSשŲ ~M*|{zw Ԩ>qQaNo4FbW6kX,bBU#4ȱ  dRiVnR#%>s' S/..d2 CQm˭216a]a(t g!ꄼzKCpN$)5oq2y:q??=H$ɆXj4`CQ{@Bjb1M>do~~~ff@ <Bq/M6*6m:(ܺWXXGiҤB5 :}G ̌Ms$ ڶmKQNW8D"iѢr Pcr!~2EvW( C* 2ӧO>###33S"xzzxTڤIzyyQ*l1[DbgVV&[E! W"l6{7irV-7SǏhܗm%6ߟ:ujqqqJJݻw݃bq]_Jm(*??m:q.hTT{[&RE64$䂝y!WQl߿]v ^r]poҤNξ>iӦT*"a lfh|{?Z2A`2 CCBmr⯿BCB!P=UZe:](vwwWT-ۄ$5o%e;t:F8ΏHEfq|ݻve˖,'B5$L\Y`/KX,kӧ)Ďbp8A*:*t`Jf. E #GtF;:3~f͚Y7L=zcQ"Ħͦ tڵ~[n(j>dB ѣ!/GV HVe2u XRI껒'*J?͑/4ì_&59M.8o?ܖ[ؖ }‹/Y3]6+3k?n:6}yܟsӧXorcbb;] dUه|q\~8GR !8NV~v6vz;' ڵk'uaa2ҿz{fzǞ]zI"6kV6OSy(____ߏ917wfMT(JeLthk{H$}ȑjBp|>yGX,N3P|~f|||B(a}P+ꕙs_Ǐ!#փ)Y_xq~ƭVe}}}Z-cM;`pT)P:!6mۙ"B 4&w׮lڰ~`П :v9ԦţkxrvfT*SSS %%z[RYSSSj֭<<rI ISL:e3gA Clc!;w4MD_??_|0ǻs?Nx !^F XxR%&(k/,*Lz? |PG%b!K/szALJVvN5V#4M.m;o7ozyzA!lDnРC,1'|}}Iuֹsgd>"!m\W?MӫW޶uKZZĉ̝ˎh[%IUV˖ѣ5ݶ.{E ׮]c[n3fַn%IR.|JgDRT((!T)^enCo(U/~֬1|x ^uk_z'M|}3gfeo(+۶շo ίYeB,, +P!boPXgFO4juaSi[fP(|f"/H ߫EEE\. nݺcGm]c1(o #+;Ǻ)V@@ZZ.An\ҹS~.!`{pɆbll(U&NLLLb VӅ}"16B5Fڬ5{9tzѸ~:?~B{rxx AAA={Z/B!HT2{[i-.q-::;^^^uȼyQ~SǎP'ǝ={ ]zB5t65P\< []l_xfu "j ζ>㽽Ta= Pe6q8Wjt=XŢX,F!̌ l(*,*j.(qfDڢz5L֘gGzy{S*l1[DbgVf[E! |h9FQT~AJ2[ ѨV (h7o_|QR-?~㏄Ej!T)6:  Ќl0bSN ƠI&DnۿDۿ^SoB9ClVŹ#kۦ5kRRˤoڴ)|s@j*+׮v̬߷/-#mݺ[ˤϜa3:}Z.j>7 P`mĜ:+WtLٳgtLLzzI<ۻwoLLD,~}#GXw[ qr(*jRP*1Q1~9~zϞ=l={<=j#[O1ѱ2&e x/r~`4 /7w󖭱1[l̬c04MێN2XVe}}}Z- 2d͚5y ɓ'{]GqBVHݰ aMr-Ua`0+3f+ZںeQ*~~~Vse2Y^xa^2#ꔔTN!j+ p@Xk:6g܉'o^W\Վo}xH$JB E{;Twi~$T0gN̙jj2@ )TrEJJyQ^!hk׶9r&N,]x1\חRDBter6^`!T\hb2tP{֭+<|y(77~.]ON~8l=Eg[wO:tOӏ78ABujY=hXDdff޸qC&q-[J]v-77(V{%Z-=wU^ 3gelE*Mשw]ްhxxxt>-ZhZDsNjj*aG`4zEw5!j\ܹ=f̰jfgg+Jk-VѰC_tm۶X,EEEV 8k-}!* -N, UV9322(-ZhѢ62%''v BNtZ6??_~^^^vsfee%k0EuJ3[X镙Bo7G4۝h4uYE*d22tFZ]PP@Qt]!FbM&SƆah`2) 0a {쉝[11{쩥w|RKBht C27ɼv >|Æ i>>Ĵԋ..JXTeܹs^"P=jEEE56bNW8ovMz7c;msG]hn2(2*E+C~AAT) nJ3mfq$M۔~"ܜ{sNs'}_~K,ѣ޽{GxgϞuǣZRF3O=""bС{~ΝC :tիWF1ٳRSS_yedeeΟ?}3gNIIU4.`SKeeeYƌ;?\ˏ;>v؝;v'ݷ|>כtݷ/::FQQ/XLʙE%Eǎ5sfd⢣GΚ9s/<r.\yOs)o7\EFaO] G*+9Y3k<=;Yݞg;硅 Dss" ,{t٬w>r$2r)XJ_ZO{P(1rBxԇ7 ƍ_իϷ=k˗ ̀BOn_,=07ЧOߝ;wμT*y|>Zzp֥bBavv6ˍHMMxu7ܱX,Ugu `(ba]{w.uÇ]yz s~_wo&ꫯWب7߰gg&uI5<B 5SIK\`®WCyQ7kX mӦw<66~ڴF[ϓmMh4 dchRRRP(4j9kr|࿋:t7@y|@bcsYݕ?~.|1,6;%%}vYr9)),B5D[H6 EQb(6枃H/r{>-~lݳtN!vR,2͖JR䉓AA>>''$H&TP+)3tfP pw(*!!!z l$6nnnB|B5oاŒJ<AQߵ@ h!Ժ<) Z:'(P(H}Q!XB_YY)AKGԊaDt1ڇǏkpB!Z_=A ;;9.Wm \0~yyyݚiꫯwڭk6niyIR-?};/4o;Br,={nݶf9t7&NLMK߾cgbb>e{tkn5WԴ^~y͚՛6Usݺ/q[ogdB~,ןjzȐgEDSKba --U7?j0>?~0xݻw3̙ݻs s~PwYBVb-ãnjqAvcwwwr;Vʕ/ ׭<77枠999/1,;!2GkJ׮^{qip-`yw+W.os22@/cr'sw_&a@~~Ԓ!FQFS=!jM)B^}"ꫯB~7 jZJJrUƊ?۲ETn[4-~]UUզM_[E-H(U~~k$ږ!Zt^oz[nj߳f̌,..:zȬ37ls>uyB-SS /{ssuCsG,Μ=;00H=lf:("׃?3Ӆ/Z" 'MXo_(BxwԇW… ]]\D"9s9sƼ#PkX M;.z >Bol)ZzդIzaZ,:v܉FYF1%}tʪzP9}A_'TȌbޝ9{'>, {6nPT#ZW];~_={L4I&[%IZZwC8zk,c7wԇڵ !,cPJcj3/] oOcnj1XXtwN}|Y,;oOy)BDЄ۰ Ku8JIyо]{Zٮg7*rR$ظ!)Ww*Q%b888؈*,k+{Mxm&m(6u'_nVxye+l:8#fKRTrĉ o_\\Riݛa6E!c0- 6=9 `oJTpPAX HP(B)єk=Zv~e+$nj},T*x*Ӆ@ : P4p'B->_޼q#&&033F"(Ɔؑ>@;]\ORim `<E B@PoEarEFhNִ/];wꞖ@I ]Gs"K?2O68z$ҧB M;y{.x|صkW}vܚQtzkZ*V[QQjJӅmlR?ؘĦ5BӖWXPP{U3uQۭS(z kH斗cggeWD!+քbÝaÇ)ةkemeZdN*̵Jg''L?4t=jMI-nL˗.۷m%ӷHiP@MA=-ޮʹ tURVT__#--múu@VWU)RRRƎ{u jnO _6nBÝl;j-7nXq9%/l l"DŽ,Y0//W(Ξ3ל ܾ駟^&88raP ZGz?%@G{!+/Wxҧ/+V\Q.+suqyQlO>d L~\07gܒXϞ=w߿+jU[`Fٰqs=7x~IW!Jj1?j7o~×,]*u!ۻozQAR51'3Btu=tO X~ 7Ѓ&do33lȨO=<]C6}oر3gƩӧO:aã n:pÇ~tmۖ e}W^~Jbttnhb*vܙwSNM6骽wHnrt….. Lab@- Ds9sF҂jDyPזO1nZ}͛=~,I7hx}+.ܛW+.^X$>}IMIӖF.]t͛;t޽sw7 _ݽzãt¢"mkP7!4MsvvnPyPהk9G C؛%6(vࠈؘrَm[>.z >BW^rӧOߴiS@@,^xy}r|РA99 ''ёicvVVikP8:9ܹŜxQ!Ԗ4~-[R9P\kqwu{ھbvt NΜꪥ5'>, _7(A_|ŏ>pwR|^vv5kKn\dúÇ gf+?//?|}}$--MJ@U=f͚5699yҥBmIӎ(G[;Dzb [[-eTd'Mj';q'Yk6СÖ.7kע6lؿiӦwEXn]Ǝ/N1i믏5ʽvIoN曺wMZ)v6cƌ"#DDG%ԘO&-5s ^ 䨚58 6/1USf7vӬֵ8ĝ_\`wϓmMh4 )++S*^JIy8`@BѻNVF+zG{r :tmz"@ H$Ξi܏]m6 &}J'6& aڷoQ?#ɳ];vo,. ͢њ ɺz!jTSRe Z$D"Ql=GHV׳)WT܋n_؞z]$z^@!ZlyMt߂ulm H4я6:ٟ"lכ&PޯAæ{PY*=b`ϺYt>b;cTyZ{4ֺ uqsVͽ.wn&̓s:o/n,ai4Zngo@B(𿥥y99<AMnna[!y:"D *Qin_nvכ%9'mȀNb8'cq0JOjW[zD)4ߝ/<qYZB섬{Y凳 6t$ &j~b\.+ ؈;WTVjfmG!hI;Jl(k9b65@q_[" 4ȵԊJ`?OWWjV!·9vt x,fsDX g䖩6Q+EosEw)S˛Ĭ>P-//wj4 F(dY$z4aKR\xmJi\ v6!`+@aVUGs֊kFOF8Wΐ_]`"o4]TjBۤ6[ATjMRI ؞z}V_SLNV㚦ĺ8psә/pe")d]wtOu4#{]&@LL̷7|޽G=Q'B5~CۉayݛXAe7ٙRidԧfΝ;NJO>՝D;xԩSNްa#ԤkCfNQ˖ҋs箄{:u$ߴGog Xfm;w< 欬&Vz5%Ŷ|y |* rٻ'?7WsG,Μ=;00ffenذ>xճ'Ϸ5s+W{G\Ϗ?E$͝=3b.rqq &ؘ@ؗ^~9.6vժU \{ 4h%yyy!4{WwBMg @.^8Ÿ{>Xz DGػo81o2lٲO?^ݻw7}Mbb"svP*((ظa#q!immm @1y.ŢiŪkRꦡΎdsԲePZZ{K.ٱ}BFXB.ՀX* 瘵ၢ(hiBu"8("!6\cۖ燏8"KCfҥӧOŋ?7o߾bX.89:{{{3OӝL'} bBҴFp8Mvl#S v8 xltҒ|zd]IN׋M PgZs~-{Gwg޻k{EE ޯU;ڵk}gz=S%J<^vv-[tH$4]cÇ 뢫gk׮YG>|c55RhÇ_.^=''gݺu#^xDy`Io(}g!+F!4bXO#S7 {>52nFڟs)Ϣ(fKqҔ?CVq'Y`wȑ#GYc] _mܸxq':uY͉ߚB`13|zk쁙fx{{sќ9m۶m>}ZQq #Fr2ѯmݺ566vmUFnASPc>?5~pp0aW٫ݛbh<y24MvҥRV_h4>1XPhn~ʅjr|¿|}}f6D;w︻a2gcbQ۵5 !4z׳];vo0EjUpcqqqqq.R]g?QPDИbqE bkgYPNث׮\\Gbc& ,| JB&b*f+]6EJl\/{*U X PA=%tMSlfhBM(J z?@E1avE=% MظDQb&0Le֖̮ !&4b՝{4 p!P(BQ !aB ÝQE=?B!фbd EQl6҄3,B5@%l6"#(Bia!ta.8EưY0!MN0X, ]!i OA0;aEb~9~SSGj=:!PK)!jbBf)!jbBf)!jxBȊBZZ6]6v57L!kh4ZW;{{%K29.?bz!dZ\ֽJ.,Bnߺ)l }:U jJbk镙fkkCp'dJLl\.eBn߾ҠJN< U3Reָj4-U899)9\,U4#db&1Ͷ čkzb&&&I}}|O<9lPkЅԬX6pʪ*BӦ/YTTt=:^ϸ*JiVPsf1IRݹ{o>D,= Txb!=mݡrCd2@ܓ Fx:>|>!7/?k 62st*/}us.\صKS\TT\Dqp xPXXTYY;vUw'N JyT*%66!!Rn:SS[P`Lc8y2?5-J)6uO>[nfNq~J¢eiii$\ڥkJJJ\.`\.`X WBRe:4+5XlJRqi!̬̂‚={t.۱cGOwoا S(" 93n4f@w:ܹ ̬8;9gegggW޹s#h49̷v cbb\" kB>Po +5uXl|>_ڦ#o׾HRݾ}C\keVL⧋[BBJRT n|DPKUUUqq̸xww;;p9J򬳉UղXl-ukwVTV4 zLIL3LPo +5uXlnMHhtݺuE))!?ֹY9>]:wpEpuuԩ#3?8886&>7//j~<{\rEH CBoQ|o\f۷rX, w氷%F֩S'cJ yݾ5[Nc_f}|| n'@  i_1"Ga]e&voְ <ymKvϢy4MjjC*eWTd{zx6 bsg}||fܕ?BVf'%&|mدSgH\>?1!@V C4MdNNN a'N2YMM`(me%H$ l>T'tO MJeUUUz/PPs#@JRYE4(6IZNOO{^x~-7k_[ Z>b86ݾ}rr2T.'&&BCCBy<8y2?5-J)ﯫŋ]tawI?Z-(0돦ܼ\pss `X:Xl4Mp8o͂boడC TZd[ozno'O>j*!1` ۉm j3ԙcb,f_,EQ44$xB{\=/hooߥKZͭSNΝ:'$\x\]];uYYYYqqqLaC[ENc_f}|| M7`  4>ɲׁ@ZCppplL̃)|>o^^^k|Z5xKqfzZ3^ڒBaR3P^Y?jU{oQ<ٶajF:hr]57@ ۜ?wǧq7+6G!{bQԇS,B*_ʪ=|AbBiLȂa 5Ā(P J8tf"JJc۵kcE<6-J%RS{@_ s7))E*bBm@ pwwX7ot8ecc;k0"ŒH\.޾ wǢ#b@ hVbE B@E-'WFS^"Fs/[oj,Pjp[jav7K^BWG!Բb; W@Uݨ#ގnBz4f_ ꅦgBm!j0"BS,B!,0"B͢1;B(+^5 5e): LUnE̢5i0K׽A4 J~t~mYڍI'>'g:c@K>pg&7|r"Qj9.6V"X=khW@bbb׮hBX,Ţ@Y,K=ӫśd4|*jʲ_E UQQBrYB(,\sthͫ)9IJeJͻn-Ɨ1X]MViqX* ZYi􇚦sΚ=utРsk֬5XsN @(U4MX7B)J쯧HyYo?77{Mwj>@Wpo6Tb#@pf̈́CW|+bD(ireXx3l_@cs2_ܾ{7!Cl\])(((>/\t n޸h6Yegڲקxy?Lc 'ݿ%;w\0j}}}/] 5a,m2sTEE7~ynΝ fjꂂo]LeЛ?q~Yc[٬֨ڜ_zŗ^M?lg#Ճz4eٯ<*\6qr/Zƍ* $#=}i]t :ujQQ3߯s{.YXJޭ[nݖEFʄg !4 4!Zfu}z 7o^eEŋ￯7;\?xQV)OQ[ fY_}3w5r4GRݻHR]w={ر}-?78""8(h/v=0s,i';9E+ܩW8qE9KlFklmӛ{ۺUGYp-߅>ɯ!+#) ;gd *`BgϚdR u Osn,Dlfs.s~3f8sq J-tsj;_}0O];v 0X!ϝ9bDpP_i94iW1uVEҫ$|>l=P^s9l6zwGiӦM2ի._lZ]ׯ~ 6:}S997nH$\a \|Y*lݺ5&&C._KW_}U\\|ܹG\rHt5].;_:K{1Ok\q0滅ej{7>,+/gd>}#8̼rjXXæoIСC9kk~?eˌu;HLJbk֬y׈ylY9oӮG9w7>G{wƭ[<͛/v٩s'u#?M\"NEd㶍1y9KJE+b&a&7K/(1) j^}Sqtȸs#|''eQQܤIΜ*UaNsYvv%Vuƍ@Q8o߽ǡC ƺ|hܹso޺޽ܩi9u5!Śf44{`9J|s|fCԲeGBƌ/L=f4r(7WWHG8qÇu5,?zjZ=ǃ}VU_}"XиzHMhSS{{aCwa=_~QT@铧^2CLH%K]]\ԩSMt;ur 2y_ ./uNʈfܑdg:ϮX 2[TV*d[TTԚk- s9=w#(< TxⱛLջXMdRJON?o]n]=ߗZ=5=2-\1 !.TD3()H-{t=ik׮y\~×,^`oo[|~~~~qQիkn1 ep8l3阊 GQ晨88:7.\jV}u뿌cNբ(JW'(,,d~ˠAµ+*JiDmeee}_|aPݲo|ebM䲥UcPb sy6Bpy8߫2s|)uc&L?2ts`ϟ?MdiGGǦ  D*  |̙ظ݀IWCVff~ޙQZjTq{Ǯ YLyNY Eh})#uo.((GwppPv=ݻoߺյkW>OfFwSݮV)ϛťaWbmq}O)~\EyeEsoiIeOkֵ۹guOϝ=۽{Wݧe옱͟[qO x-^oM ^~,}3wuR_vҊ/DB>cj_,3g͞qFR ~fVf堷g}^\R\\Rvg/"3#֬Y[T\\T\z͚#G2_=kG3s&L<=#]$%%_?rHbdYӑ3jJilӮ];oO3d:*7SPJOWG6mwޙcǮ;vT̰.alwÆ/+W-~YwSo΃<8k XA r4SNaCѶV@ULLI3NcDmXve&T$qlL32MiTƊRA+"(y9wwߗ>~}=gƤKdKl/8xQ)~/.,)J5LM*++qrj o-k^\6lȻ|dvgnx#1D~Q+ 1 >c7LEEEUWWsfݮbawǧM"m8ڨ(bt+ ҫx Ƀ6*j#6bŢŋ&mXxۋnΘy U,V*C3HV(%V*hzW٫ojw[o ul4> )٘*;#=o֭[m˳ge͞=@(_bZִ 7&%'_zѸ(+sP^PPK_:;{ԉk2q>Dmk~ý^ܟ*Ah|VtCte=7ōw**Vi0utZ*/yayV9c?11c$&:ZM-}=jNZ r/2lqJ} Ciiٛ{S OϯʒҲInہ+5L\k<1 jwN8W GyrsrNX33c-IIWQ1b_Y %<fkooXe8m%*pfek2B lv'zr==bbb:|Q('O^yw8.^%E)WO<6+_ej_hG;JuhH>}'u oWI$n#l~'M=G~AR䌼ֺ4}􇳅[^+h~Ќ? {2z9p(67GSgcN×jN7zu'q(2i 3GY!%eˆ=Lx#"&IhFsCРNZySl,˺NWWz::'sj5TcTJ݆;Cgτ1;bOÉyISus׀W^-o6@iLK3%+oKRTkkKؼ0y ''2=oe;o;Gؤg7cS,Aj_Wjjq}XXةϹG}=}ZۄOk.yKFh+!!!W ZX' ss9x4šW񠞣@DhH>O7Hy-63a$nIN'X$9IZYyc۟`GGGGHؤ  U^ldX\iHLhH>3Abwsq1G,֓)p p@ V;IbBC   9݉$IN0lXh4,˺xALhH>3Abwsq1oRU0QGX0sA;`Zd7\1# c*D,\cr'bOY+@/ 'c`['p %ރk)JՆ-pjշj mMgG4, :1NMcsbs'_憫t0F쪎 *)OSy'f4Z{r'UǥGzB!EQBٳg($ m`٩W2Xl}XvbRLEVb,awX/óG}K~#Z1uĴNTZ{@M`L#K5ȝK窝cIguxWnL]pCuT2[ 3,}c\JW0C2X)( 03*7aɎ.ΦȽYWKGd#ؿ ؍ucIqŊC3gN&j:Ar'2n2*6Դ@^mVuŌ֑@Q@SN;w+OIXZ8UUK_;՚8]vHԦ~1J;4_1F+c!;v,` f1) [Ќ]ap9*QV+lvvt_u(k SF`kG_2kgÝYS4[^tеf4ٟ\sXb6 cLU9ScCUY+ Ke_}h٩+ae(%AlK1FY:sSΜ5Ç:}ٳlЬVz\\],`u.[(s,Uؙ"?JIK:wb]̙3"֭רqURҡ4*!F.D]9h%LYmvbY'bKdJ$Ј4v[?!NH XVwv(F׳`L#%v&ECBKR#*Y`BKcuu*VCD/Ƥ0>wδÆA:UgrVm2T"P i5h/#}lk1;-5`c^شDhbGH1HjmQL9&賏50`$#Sc08t`M\٥5XtEQdމ;wƍWZM1 1VJ"_x#O֩"7x\`xk޽}N8AR[_^ V E>t௿nٳgoJvVjԴӧOgeݵs?wD-֭ ETf u,W)iXjY#לx(V6>XhxCƏMShQ4 w5DZ[rD2~0> PQ-Bs3}4 jTAC3y#7(/XT|SˏaX&y0##;TR~aYN.S41vS3UP:6iX"K$3w2U#h#/YHrD g"d.іs&(PW>p*eݸC.zPXODr_ ŶG]Hc5kNDsg7oy߾ѳM6RZZZZZZff?Ï>䔊iieL} 36Ѥ'u~C%'e>[sq}m뙨Crn쌐.úV[yÆ `}1u>,P^[w4™ojU:v01XPV֌D7F>yu[mhJ  r 0(SF ;YyxXQdŌ(VFVmvxcf4Îz1pRaUd1Lc0c@t-)M^qIa^`;bJ1c!llFr#t@6ΖU1s]d=gpA!8ر*iBЬ.Mn7[H6m>"*|2ƼR#ݳg޾}jR ̟:k!_:=nk޼YR1trϝ;G.w+زeΝ;r-:<ۍuKBF#SYhE N&΁pUGv6n8fZ)M4nڴ -qM7|77nԸq[nH5!)UQ5NucǎMUWunڴIǎfK?6X^e⥊q4o8 ^0x{٧aͰ:=GHz~lXG(H;"mtD413'9~\X_޷o={}M_mȐ!wTUN:F Hɤyq(B8[|`V&\s}^z5 .ӿ[z֭mھ;vZUT=θm@0⋋_Z_;w.L>:][|vD2*cafwncshxnMؖ_=: -^b竮z9cǎ[9M҈~l*6Vkoxs0?6m8p`% vǪo_N["sE/AQ@B_- ?.( Tq p_{H߆ QťgO$)-hb5f aEBZF=d֓c\iZ1F[^QhpghpPZ x#XɃM5Y€Z>t 6SFMXt v(b BEcƠ V}ShSDt[a D+RZƏ}-TFi݆tUIA R4k34<@#FH)ƈR*қƶqv.(a"hScE7tU(HU FuJEQΜ>֭7nƀǿO>^Դ44>z*PȖ_6m.BJ 2s}qǏc$XK.Y~CJ"Q& ߿{ZmV9:{lvvvϞשlѮm?{l5p{#^Z믿")~M6xb4i Y|hѢ9Mӧ#Lu{<f2Ywky*UA#G$EOL>u*777-5iӻ_}5BHU_JKKmw$ 3)ͮ(J:uN־}{vxʕ1ZӬnMXNXnݤ'-yqI h\hQnW ]`t=77{…<+ׯMƘ}΅1~WVZםwޅ gmrϘ9C #?q q nCavfbaIy^W#:53/F ƌ'|3 .P1?7erk!L^*hsDW,@3F6lfaAc(/a! a3}:W^YܳϺ]o0`C7>}g}Fq7KꫯM{Ŋ}Y=>f{aժU?>iӦJ4~}w/Eꃬ>w! ҵ+(_DWԼy9s?nN:;f#Slذa߾?4X1TeO2dP^.JD׬'6P < bJ@6aeo+c*c./ =dCg\qxotMF/Y9Q,HgI\3t#ITbj"ͷa<DF,# Hz> '@ nEgij gZfûAK  G7UUIv|}Rp͟~^k޼yRJJ(h  #7;f̘olٲ˗駕*U{ٲeo^չs+VK6|aVf ϛ6m \D0{֭+&}$$$*¾,??}>#%9YUC~. ګеk72}SNYf.Gxo?4\7v,!=wyJ׼6[M7ؤqcr|Í76iIow=*..nȐ@RT3zL vb)ǎ߭kW~ݣbcc WjIUTP( E9vp*I{o߯җ|0VcTzС6f=>tr14 \)J nzsmO 9Ų~A:ocZEuת-ڬIWͩ1*F[IF[Ջ :; "a&Mh(<3}c)]CHh#kd`O%I45;07\cMKAF-CKXa籾AT Bq$hKLN<Ĥx#%%~Mfj;dȐ3Ojȑ#ot -. TvtqȐ!zZ1" sV/7~Э^_|c}VZd%K#Fvm۵KJJھm\qŕv¯رV*|517tW\9f̘^{ <jyLF g~ۺu+-[nEݤyh.E믯r:3 ߐx}=䂂nLBǍ4HBPFÇ}W^y _#Ϟ={5/#Ռ3oyyUTiӦ,Y3ص!4lS<2UQ_lY_^!v猀T}5/c[z)V^ z.FUA1fv˻-#A#b@Kaj6[+0}?ߔۋiq`e [ l* #&qWzpyAH4Q eX¤[rngխai8l`eݥJq`z43 ƌ|ro4]zc` a"QwޠAv]5Ԋ'єH@P&h+^7f7п0V.]zݵצGL޳wrвeKzOj<@ 1)N[իL|Xm߾Wމ vb'LLINO[Pzѣ1rzYVMcÆ 4cs~tָqcd{wɒvރVoh'N8ydBBBƍ}IÇz|NW^ӺMG|' GYk,5 J BNF]X_T+b kd0unMUBeQ1tfbn^'sckC,9,’'/hlOC5Gk@kepz@ZKT}Av b ~ G/#: -Čf.fC؄a,fW`<>?P IDATہ60-.L<)&ZGKKN!IlLN&.] A3 E޺o;DAU2֬y7==e󺊩>_$ʠsXfdt[o=5[rj}.m㉉ݲy͛;uꔐ`-,m-Z7n(3_<+3A231?-e-=_'u:tXbŢ"@(ѼysضmZ80wbvSd/T,&p~L :1v߭,Bj> Eܛi鈑!7[1bO a 0fs'8\cuY0 H@ƱbǒV jvcALd;mp)%t$d:_,X.AXVD_KS`#aZ$@D'b#Y SUEa/T~c0s/uT`PEØzHA@KscYyC *D4YT-Wd)˳jö0x ^BBj(|87r@sAW2 bτ[ms`v1k6Rykc<ޥX!R c&d5Gΐ [ä.i ɐawځy i wj5YYPiYR0/&ֈeKq8 bwgl^8jv V8rc' &tfLbi6/Zƣ 2gW#׊2hbBJ*],d"z^obbRbb"MB%RI4^pyӟk\QWd8@p7[Cslg'9Q @{ALmՠ*kKsF됾]D-VҠG\[8_&&AFB1Q>bmG_J0}N51T&MfuD_nU$! {j<8cLj`bcp|V&8GF"{nVNUUw t%i VLXu07@iՖ:6R)c}G`z"׬$7S c"NQ"621u!Wٙ3B_Atɂ'cߟ'@Hn0J$]"Dc\XXXJ Fp_V^2z ~{(uӝjBȦ@e%sdjqI4H|D^0q;ޤU3Ə@f0]Uҋգ&5hw9|<#lH^Z}VQ3I m|_hơܔiw l)Ÿ7Mӟs=hcX <srZA.6B!č=sT'm-zi^~. l$1ne 8o`:|g%yU>e CǫϸjC*u` 1{S{ t{Bv&@b4k\1t\ F&LU#c}*rH BoQz5]zG/RКks@JmHcY|z015. *Vz%#rN|l%^L/ 5=+R6/Aa d)`*%dz ݆sv 42 NlCF@\P0ؒdZ?x!.; kŀX{ _$v#tQ|; @P}}u^JFok6Ǒ_ e*x B!-\K⏊1bP' bcvx`SwT1qCiyoWtXb䪄D9DKیvɑ2 ؀.wBL!\~'ŗ,\RUUa{K hM2ZB$9]Er9i%Ϲ0%mCT,sY>%X^2?Z&fy`.  4?KWkه2, OO$f5;ra;<2qj~6j'INM*o50.k -S:uX^e3Z6r6e%Ngl9ƻ(~`t_t:řMd\Hr܄ 7aۉ 3VrxEkg^/ǜ Nz?iXba1TK.m(=*(G@bv`i xHL6bXBLd ѝ&ŵBF H4Axm.,14 =eƟZH7 @"FgƴR`X4#V '.Tvo1IOgۍOKQf fgƌ m;e3@l^ HzwB7P#l=Zp2V@zD?`]}ٞeт6V,_)%HS8cGK!J[/\w-7:SKxi:KPyWelA+P`LԀQ L 0ćF_) bɊ g4vQp%A,m4I` w.(6_ o&,F-%bWtD]@!-䬼ʌZ@t4FHRAEc>(L= FӀ[dcDDbfBH $)u|JycsgpiYxh!Di^s:н**{bSYzpdșŢ[7ٳ6 CaK0-J`,@x&kd156qoU`ǰĶ/ Ö: yx@,•tfV8{+N(N {6nAf UxyM+gnl9K}d1?fHƃD@҂i;8Taiy!Z"&Lc.}1M|e8ŚYNÞHOBkNjA(dȰ"4os`b ׁgH*#c$0C_.XscTKN4ila:SEqĦqdHA"aQ"Vv"c1ڿ *{f.Mԁ_Tܾ@,a<)3$)y8 t6:gRi`Lˉѵ&{:JzNآDZP_'}Er@ڒ[r;,C&db ٲ5!j.L & BXn) -H qGՆMNIXvJUC.c b퍥{¿7b% 0M\" YorF{us^N#;Fkb-eKmL %)%HSFr- n_ x(1Zf ڊy ǯ/:+g޷l73W--#P$l4.EX6sJRƗfGF@5>GIz pfUmZڄdtVN/iUK4X@ Ale&r/l ̄:Z:\Ld 0uD=ݼ`5p& &ZJJ*$﹐<0Y jaD,cecdTDZa8;>$VȜV4QۯAf"M])'>d]}Q昭^BZI4hɽDQ̪K?;*a2D$ 0`Sd4`fjh)D bXІ Z_mc5#ׁp6Ao6[I!yOA6?2l9vOo"!@)ޖf9[&qB#3:&h_U2GR6BƗ %sH.ZIG⚭\DDLuJa{񖝊[]xXF\c36/ojJaR%:15lY4%#1fCcRmV%fU%نQe)6H&T€ ᦧDN-.%@,kneSmcD<¦%lla(2aNO0nmYKsE/Yy-1:J+y eϏ+het+5"t~MLluVC1"q&3Wo E.9d3ff RLױ$7&./aszفzmׇmj '#qA y@3`WMneB|{m32Y+#6l.&PaYS|V +CB4-{]b\0UtUknga2$8BfdWtuL,nz.˞8"갴cI\h/9s;;)ϷgЇ<6j>Xe=7Ш¤^sSUs(*ˊ1dqdTԄN  208hui\Mc,VXWe9$krܿŁX*_3JyN)濺ύorE\o  b_`UlF;#fe"oV!^ћϣ1y:IENmV;% {|_3{CRRIa ibLȁ)S ;XJjrSBTRu.QHo 7{,ҝ21GH!P&*naicd6`cA4UI]~.O,B V;ǩx(a{\' `̌NK7bUlYiV%hiS̀`q}9%AKv8wJ;ʟ{ҴVҬӿQ,d튞o[:IHHHHHHpϫ/&a{ (f阶+*4]12;{uz'|L),O8 A(Zti(jذ97hРhٲeϘ8}BYz}-Y ꒸yUN>UvY>z]^3fΪUɓ'g.xOffllԨQ_DyCQQbf-ec$a }Gо}{+YvD$0{!>-[[ծ]ٳջy@شys^T$%%}zCH- EE웈%. ݎ;ɓI~bN pBv@Тy|(((ءcLWQX5dsM8q~1cƴo߾U֣F枒Bs=wU]ڴi3q{՛}my^W"JئZxcc#3fرcǎgΘIz dԶmvWVPkUVoGe9d,A6OR*Vg=9+Vtҥm۶SM trwׯUV^{k-6IHH\LA0͛7oެ9!=Νkٲe()S~:^ZH=zСCov;t<:Ѿwڹf;~g6lϛH9?sRRb JD[DD(O?䓬쬅/ҟ_t2u{=7o~76nxMkfΘPYc CY? ;u%KׯON:l>Xnܼ݉  L2eћ6kRjE@(I NSSS'O'bGz99yy'VGKEPid@ZZ-oYtلho[ݻwj7?3-~Ǐ0䇅nX`'1?0s̒RURzc.lĉ5ի<8Qz5MNN&`йvO";ӎ^ډ'=ܒ%K/~!!!q䇺uVMAP[b 6`@g|k„&MzSN ;v@?q)Lɨ\j=%HJLҥk?v횔XJ }>{R9ze5#گ#GO"s08M?z4EaiӦ%ŏ"HI$ח^=޻`RXTz9\~uN>mB}8s飳gϛ7mv#FѺek(cGnzkѽر?:aeh5~޽{ݻRJƍ#cǍMNJѣg~ڷo[rn1bРA [۷_Ϟצ$;Fؽ{ǷkngJHHs`BC{cIII IDATs[6GK]_ӼC^kܸȭmn*- !!q!33SGBB}𣏷D$!!!!!!QXyjAQDb>zEUą{"ZW| b<~jGX?Lw>/..KS:tRJ$UVo&/67n.{$$$$$$ s Asؘ]SؘB6m¢E>/++k iS8{DG$;ܻwo CRoDb=q^OKIwĸ8 }O?:b/uءsNZLM8Ib>o>e55kɋKJ%r'*ycҒbbc\a%+ĺ=͚5wcǍ;N@ą{bJ1#.eu$$$$$$$.ɞ8oǿ慗ӅKU r \=ORU!EYfT[~LBBBBBBb{jժUVhsP(T~UBBBBB vFX܃AHHHHHHH0ơP0 qq-P(@ %f5bSjJt3rcse\){"}S^9!1xmU =F8׆// m%$$$$$@ƄTPVga{4``cESxl[}B.5X'>Zc?p¦MԮ]k}$= ΙX&Mjպ쮻:{szFFȨdɒVZVaȏȏ){&= >l.?W_iOΝG<_~;^Gg;G[uʾV~G~G~<>eohՂ>L.6.I_9?^ZՄ SNOӣ-fΜfȏȏE)k\"{*Ńd3۵K8rtG(_f\F BVk֨qx9ڥ `UU6m٧G[Tɨ|aHDIV p֚JoX&ۜߢBb<~jGX?3j׮ NOO'b+WOTBŜӣ-=QVs$UplLLQ. ) AlLCI1cFӧOI6lĉ; ޽k=ӣ-4*?#?#?sqxRQluDsE 8'ƥ$LJo{Kz[A֭n4i"=z4A :vXݺuǏm9Z+$$$$$$.v\p=IKq-#G++2v옱cDN RD1pI0k_TJQ^wJ| r1/f^R}͊jHQ8oǿEXf7FQJ]D9UE dqI'&Bǯ-<|wڮ EQ,%PM$$$$$$A@HQ\ \O4ߠaT%Ux򙔄A=B8XԯR?Mi_]-}Qte`\ 0X=! Aթ{F+&ֆl+2?TI_׮ܵ-bib9%$!|~RA@HU!VV7TN7pS,,>FXh`AR`_rkl6pS,9 *ר Wry]h[vh 7ž-pm}weU_-x 6"E]]GF -ԿF:®"[xZWs?CT^"mESi|G~y,919{[UˮA!`pS;\JCcrKH\ߟWntJw'VPR,ۿԻ/X? oX)VЍ=Vlf(v7LF}Y -<75vO.KU={7w?u!؊ME([izopXɮ=<0>p{'= 1zgۀ3,ҮPT@dWISY,!Q !IE֗3ؗ#H0&$xQSWl)u>^4w<*[UqQS- sUxgVϸjm\(ߏӽU uժ'}*9%mZ0#vm!oǯO%"s(慖o*"/Xدi̤.nؑ6ږ]i׃C(r`E -XB< $#G} hQ}gZ+*kᶬ/c=襁? U*. 3埴|`qp iʙB,ЮӅfLOTJT!N3%)'}5d{!},,ҮPT8,gDy@(t^wI!=aA5!U.|?\  RZX8 1hx[C̲G}e/Z=տYRY;[ZzTCZy/DO2"!z%_c_TsN k_s[QQP(X.|Z$!q ΃ !uY!$y=亮ajYDzEh@,B`@Xf͚رK?e4pۺ7kWa;**=[UTV-[uk~knкUvDӕWr$عsLjw[_~9M(0NiL2Vk+2ԯ:34j%ڵ{lΜz@vy/Ν˿3f̪^Pl5޿v2'Ҋ{~u+ov[[.\ӽۉ~R%doӺ;kes^V;ZfazB:kJSh+j֨qx9ڥ `UUedVa6;v6!mmfm'n7MOJNNV4qltIcg=~!rcw4~]w͜1W'&&;wa$RJTC >\vZ-+z4&]fasʕ+dAbjĉ5jhkҸѶ;/!:t8==d\RE_X+@8(D!"rt8˳l۾#i knO4G*vw料}M{"7DiSGҋbbؘLzpׯ3ihҥKf?6?oݼEsUi1NiL2a˼#jڊӧ?6lĉv5QU2h#L9uSgL*/=MNNߟlQd&M^|qq +;K ?ѳh|jY䈤&Ծl1`<*UJ+*= IgfΘYn7l߶-I)I۵[++S~0g͚uȑn]VV|ϝ1hZOC4&]UI&6k.SZh1ayxO=9QFW^yŮ/~,3p-}ٱlZT֭CS&MHGݾ}A Wѣ{_˲^={\skTU^z:Q{)ʒO=ިaþ7ԩӕ%>~Xϥ)spq_rVZ5;r"$!!g߾%/.ի9rBkt1Q 7/"2E B淂ΠkѣgNr];BH? $S ŋ_iRw.)㼿GQU5 "!!!a($$*VUƕ^Ry PHF>,KH:R%{~xF rKj-7$$$$$$$xOyEq||8 * )*Į-1Rh4 (RD.vXbԟ-]AEEDQiWz^iy̾yvvgy?~̶w/nSn R*i% {p`w⚋.)͙hianld8b?|4+!2L'z5cVFGy;~ٳgl8V[n/.>%mI BaRbb/cપ*hSUӠ60'7&&vfh] aLLl||BHv<{._.gsm#((hƍgW 9uQF7k\ڵklmmMGGe%% ~=BhbbU7 ZhѼHawCMwl{Azݻiy(*ZF7/Rng 4Jv%..cYjAfϙl>t(eJCCCF߿7թSŋN>%3msm|By♻u") IDATi@ 2l~ՊХKhhxq}׮***t:x(n$tOYdn@Up7n ^ܯ{dP%ZESL͋u;K-y}Ȍё=e"fYYv$X,! D"p6Z="y@1dK\?`giYQXXHl4(9JMXEhGPЌGlNaQoBiii銊d0%%%o7uAviYyY9S-"P6Ez~s.222eG32dobEEEhQBE&O*ӧqyY)2[iPfj^QT*EI ۲ysmm-Ŋ y󦲲2.-GMCDxxqq@ xzU5}ݷ}}l,Sݷثt~OEcnj662;ft߾N F+?,Opv(ѯָ<ˬA}~ME35RR7l3517vSSoK #4A6s`~_ٳ &Ύ*BsswxS3CGـc[mLQe:, phVhz烚c3&D:wlΝ)d2I"ihhhs z~Uza*~HGO{0@am// <4hHqLy"_sVqu[Gq/ Sd•U#880mm;0 UܣxG(jkB 4%>96Dm%AwCSSϯoJ O<  9Ph20,qٲ=mzHNJ"yyz}wZY,VPЌ=Mǎv^hhhh̓v4ރݚVtrP_f =vAIn"܁ϲߐZVV`KǞ[73] 2uH:34mE {6oCT$Vi;dd0..߲u@ *[W^vÝJt9&&ʕ+D%K*pI'a߾?&M,K^f:~TWWWwOwԱJ^s'_#عz=BC_~-,t79ҨUvCF"n]" #kfsLML𴩉 lccB{,VBDOjJ@۪XO5ŧ;v_~5:uNLZBwILNɩANcJMyQ)˗Wp8®\zjaβ>Kį1J\fS}ǎ:wN:UD"B;8B>útaܳLXPDJ *n"Ż$666z#3ӫ~aaYXX`0Tu׍KvuAK= !5{Υ?RDa cƎp9.'.>nq~ܸ >>>wEFFǏfIo'"mmmmZS[*e-^Hd#f_ϯ0@$ĕ<LP/KDIR݁Ie‚0L=f2aſiܣbLV#{H$H]Z&"4#*y胩 mkHKfu_썩ѣ]a xzl?~,6&f7_UV>}tǎ -4wޑQQިUܣ}`*@0tI;^ ~)ں)TwzxBoãGK,}v.]-}U~!-/;MHH(*.9mb]\Z CGf0n|ޗ/^ܾu+ Nf;#F9rŽx*Q C|QMJ"]OwӦ{٘ϝS}=x----#y<B!O+--E={!$ {ؘWUUUl߶^mZ2*jQttt7n܄={?h41ٳg{f dŦMq=1')qJl*}WN} ^9MD]:G,as~yO20 H<,Cu~:yڵ]ivvS&O$'OTtXW2{<B yW`V'-s{(3f8vwcGΘ1wOB9992 "Ң‚‚‚Ji/gGnsUg2v/,,}t;ۂv]HK 0, %'M0,(h 0 sZ{!`X͍nw C>o܊9 o޼q먧]OS_/>] H%&)qJl*+**tMM /;v3fs 5556={J&gy^#+P32 4G*ecL>'6"#7mڈ7na؉& O8ALC <*&f?zcN?׉O?gNr{[qqrfVɼf!\?|/ob^fSSS"Q^^j6 OlGtttuuwW~YYY[lEX,! D"زLL0СÒ%KvZy?͙0k֏[̙G x*qo*u'ttt*+\ a/]Zn=BNfeKs>AbQdb(pF]B^hX}Fݻݻ㛳~qYڹ!!! 0cƎ7+++aR3$9:8dmqn*Z>qXޮ/^XXX ^|Iq%N'%%%zzz!*jies'''oٓB  ?g&q[y )BKz--ZPEE֚¦hÆ}} þO]PЌeܹsUU>^ȼK+=(AuZ>fggCOOO|ĉ9::ZXX+W._6+, ϣfq?>|hoo$+*g<"*Yqq\.N+Ǎp8NL̢񾾸gφTO//׆T'RLCDxxqq@ x/4M49!a۷o߾}8>DmllRSS++++++ׯ_׻w=3o޼eK\R___\\4wOn͵,+2rzah4|ڬ4L>@QT*EIDDty>╼^,ȼK+=(A +ϓ ̞=g떭[l={B#GIOŹs?&{s'BݻwC}/Λֿ&3g1y!xd)nn}kjVZ͌>v}l3o˯7% f'קߖ#G 4hzaϞ=g׎\D6ř;MVKO&QGFikU_ y`& ~ ׫Vq堸P(&#Z>\J"Wzohh޽zϏl׷pj~f)a7Ч+Ч㢢ðez#9) L=|gϝMݰW/{>W]%2(\\R{C&*ea{YBArri#ؾ}S_&!].G1❑H앵u?4ܬOM7%Bڷ~!L!U|/wߓ)CNӋ|ϟkYZ=:C%PFFɿN=:bĈq}RVY[7_~"eaghVX]~^Vtŋ[6ujHhh\++ ۠MZ+փ4HOp9utppHJJ*))Ql[\ͼs]Ybefdc:wLNKK0~{ ϧ>P(*gOK{*]|*-CJXe.WHYݻ;w^r%v >/q{<=}ǎWV7߾<~y<ޙ3g&L;}4#;UҬUӬ=f)))tf8+77ן8q,1)QOONKNN>q?22C ~555xg>};{(NulKQ3{G/vOPOSݥjoR+FFxHOu}WYIl}nϯ}>4"aÇ+߾ѺUҜ?ڍGc{ЇI/{pOOKsssPI ]]]e[ ]˫sUUU66=oSMBocc ;B(aNOi IDAT<<=|YYYᛅE Cŋ[wȨ^d&k|JOOOAPvإ ~Ν={ )O>d2 ˪'Kޤz ?(0'wy{'Obf`ff^\zŋsfhii9t==Ü>v}ԙX{Tct*1cs7v82 MGR(T%Q oS"7i?U+SJJKJWLX|;!&fQQq_/*.wp6mZ͌:^ݰqtPBB5/^<~/e7o4sC6o"##Kya'K^oh K+ǎd.rd:0S⚰Y۷}/aa0;o7x3O WH <\>g~r3%ی^N8`  d䗙N|f% K&:;6!>L?mTW/!^COX|ioo?bs}+W5pGy[n !WW/OO7WݺFEEzy]ݻw=! "l_,--BǍ}rsSx񂂂n+~&6?A|ZbĦ<_ ǥJh; :tpuu]GU]yL^~>KbOMii)/\:tٲD###Vǎ:uZyVʩ#Z[[#l?ٹs͛;vDpww1#Hqʴ0秹#F044ټZ$xpaGSS…4տSw*jjkk/xKޯ8DЋl633cx(NdP@YY*g|#ŃV r4ZWy>=4qH$RBۙLfjꆜGe}es/_^0:>.NڬVbX }>ݶw/tbr._4a) (Bh{\9Ĺ_s*h+P?91#W/^/_tt:DO }}}BO$BZZZfNUTTzQRRQ3mV 8uTnY ,,,.~J~?}ݻ2'k%qAviYyY9h4ڰa_8x_ FPeA999ۿI+WDNs.{4'>.pXƍp8NL̢񾾸w^l\[[b"#E ߼ySYY+i4ϥ+g/Deee;vXj?  E ]'MHx\#Qn޽2F?D yy!!2eۻw)d6<;!!|>0~x*i=n<ݝ޽[E2.\1̘wE11]::pwp'OM--G>h BGϞC;WΞ=g{+@Ut=]CPo[n?~^ɲ|V@Ecnj662;ft߾N F~CK g~rot-͎9e6iZiynojb_pd6<;G wf&˖.ݾmuB9ZkVW m\[[D5Y52 {hn*Q}r@;DhJ|PT@•Uܣxfa6@aP(-\B1 J=BP[vM!_썩 F hЧ5ESSϯTHC`Xaa*@0tIUЮrX6Оh'j( E #okT ۷;9e2BArrióO6$pR YCMvvf~˫uVVG0s aoXoL!g*AU6"- CKDժx)qAe:UahCii9(JD<۴SCBCsZYY%,N [7o]r5]v9gU>eyJ),􌛯^^ÐЌt CΝ#iiioxQ mDZSBJ"VJBВ%Kuuu'/_nhhЩSǸ>^NRts8HLJMLJ<~(?qO86fFB烃CΟ;>[iid~W e i~Mc2L>XCFa&ZwILNɩAs>$L񴉱qy9OSd2%.IXչs窪*Raz⥹9BWzzz^OOЗ0DP---vѱK;{A&S0L@90*g<"*,$BH|ヒ,.)  <LP/KD .,^xx_\?fx\7v8\yӦC0 y&ooo>H sX6!HBp'+555/^йsg L"iH$SėUU==B%R|RkQ^Śm:LdJV%>A0 C-L{L"D"!DҡOgUhSB&f@DH$T=d>^(.իW"&ܱ|`L@;BCDĿޒUܣ\dmmԣM6-mzrV) Z=ʿofee <!ێ*++?jh./iр⪅.&(Ɨ %d߿{?sfƍ7o߷|3CCpeHH[,ڽkw:ٖi~СѣG3 #G}ÇÇB#F8rW Vۣe{z+L/O\00xDukZ[Y>{ljjjv^JdPlx)fFчlڴqfXbcbL&Ɍ;p@4Qyyyfֽ{Q t22pto`OC ¤^66&F!!UUUx]t=M6ecjbJ]t)͌og.gHY+evá>>7BgC&rnܸ3l$VpD2=GwA22{z޽7nߺ-=spt&W\Fe޾=y˗/YYYsrr7&>|;w*v@Sd&*K}ynB2}D7aNxz!635 t;<:$?_`䛯mڼgϞ }: _Q$0K[W!$8qM\]]ѣBtŊ.TUUylYٜGL&ʩ#Z[[#lKJsn杻f?Ar >˯M4{PyHT\iOwsi33sPQQ0/_zɮ];oݼo;{oy*gs 7֮]3w\Uzzζի%d`0 B%讫0:8k pH ΉK:evC*jies'''oٓB(GuW^%3-1y!]W-abwwqBÇs {Zw qp8hoSYPT*ŋ2|\zihHY\ZZZZZCU_gѢ;9::tvv֖x4#FvŭPvBgΜ8Zk'>Ϟ= w/KzUرS;AlzEFE5df.FFF/1b 93t</| C4440 9ҠG B5"|hjiiiɘzWSS#><@Z::(Tc*Vqa6YC hQ0  _B)wéP$Da"!ή頩t^8j( dkk4+Z|~R( š'ɘ"2 d2AAj_`>]ZT֞IK;?d c!]F6ŋL\]}t)BЧbia77??ȓ3y$k+KSQ#G9} LQ p= ѳ1c7'@ б|t:xi@Ƨ=哚^aU#ܽw/"<|۶.w~q7ݝ;w~7oM߼yn>hB޽۹cǏaa/]B= _m6*í[#ʚ/fO"e{7m3u}N6T0zDihBcZH *Kz̓]xaAFۇ!G1 > Z IDATxڴi&&&lDBbSv"6nup&=ܣmڸ%~ dܴ16.n6Y| ܥs~|)v]h]ݻ[eھtGDD=~ofee͏G& Bw'AjT]{-=租SpzW\y+ qNmM5&Ia:w޻wg%]^~Ԟ{44 =@6!6J4v{?"H"3hBDDTAs.œVqmm2_/ khhHW<&kk/|>Z=Q}.ZbJ 7 aoL0 A`bCIR\*| !0 [hE@a/rom-99e=м=mvA8ރ!$`A{ѣ ,hGJ0Tԫ$2-t_< IllLBBp y0ro^eAק{>0*.Py*a'VMdZR9\qU.]I>J]t)q Fu{we@x)3hwȟŋ jjZZVpSS74m4s.q$xfӜ%D}25Kb<"0 Dk֬^s.˓ۆ ő I$tqښU|v* ?gH蝜ߏaŋ͝(PN3=tZPJ&Y)OJ6F{99}Eq^^HH0  >|0V,h(iwIł5i:m&A5I:Ξ=gwuu5>4w޼7_ZZjmm16|W\\lmm}veFxO~ t(d.d*Y7`q:R5u({#"#"M?Ə?WqY$P45㨸^3M4lR|([k֡OgUhSx͇xΥxϚ˗"!ɟͭA"LLLET@q=;TvDu A2R8!K4eBiL[{j`<waa|0Znڠ OO9N{nn ܻw/Q}!s/*}8{e˷|)~J&%&%&%%2B{~3h@77רx!jeg̘>"\\![hg߾;ة=c //E2DC=2Um6v>[o,3\wx\ |^ӕBt"_w&#MkZ񺵎.Fv(XcQ1Jy'o۞2+FAMƚ < ,]Ν_|2QV{z!""BA'cKNǏ%<>Z <! *+7dn ?ߏ,5nܸ$<ݐnÌwߍ/(,QP뛞N.sCF˧sΞ=Zlܜ\tYT#޸ay]zZoӪ;&iYf^!A!Y)D3irtuk? 4 f0U= = hժՎ֭_ܣG?Oekbu˖-DY-9ڇM#7G^uux_3f899r8N֭;zWHff3[7y+(( ׭v_zi8ecoorӧOϙ {k6e<g`(ܤq4b!:B`EԲBএCuq cU ~yH7WWWАXͷ䜎3zH'OL,4/[[!]1̲icU[lW.f5T\.?|>ׯ~0,;';)!!::BN76JmmmBHLtt p?)NNN^^^rGGGC VUFEF544&p6W蕉TTT&B(<|pQOtLHZRv>Ѩ5FaQ?k;99qFGVD ױ4+<{[EkKa2RfsI\ER5ut:`,P4Cg-U=0LRVk]=MBP4ziBU=}`2s-̔繴*g~k @[yuZ19Q\c 6MwS)! Co6|MBer^4(K v2߃!Ra^7C6F&=`VH=]R0$UjF8N_AV pws@ܽkW.ɲ{(<1.蕀{wDb^7H,~`9q"Q͵+W&gmݚ-;'f Zz5QJޕ윜΅EsuE!$UhF_lynޜfcc%K[ܰťGiiǏ# fdutgXc%{L8?[VY*SLBɴюT*@ xixB0FCzE77"Vy_s]&d& 2Ryx ggg9 XL\nW˛ r5b1Bf3?HLHJ*.*ݺuBrņ{LֆQݚ;F>?3:ɓ'>pѢ?ةS9uР{B{~3h@77רx:% <!qrl^^}b'QL.KLJMJJe† ]Z!JP an:4%#|(T p˖oSJZnmPPG tAT ӻy<ݻsYTjs/<ܐPda:q0t٨cHZҎAG :l_t o߶=??dV֍B5xy撛%YYwRUU!г'eT*sSVDz՗^S#rws1 aH$pw'E"1°O\Y˗/IFDD3=Ë#%KsI ~yH7WWWАX]Ba 1o^:u!DL~w7Ɛ/ >}}~١!!|mo&t%7=4UUq=R#<|0rԻ\nYY$xw EA.HǯJ_5*2ή! 7!{{c~>xð1c?d@'M* d2Y,[*>H# RN_u:o޼[% 4*0Yu,X<kחFA`D:.SJ4irzzX"KĩD7&NLMMSRS&NGEEܱc䨗1;[Ҿ|1)F-~w[>ۼ8a1~[d{Jhxԩ+Ui ש ?--m<]g4(֣rɲa1+ʖ.[JOk{ol!ɩWDCCB -z+*Ǣs#ꫯ̞5ou;?4]+͛o1|x>wƎuuq-[ړm>xpQÈl+/p" 6-_ Oa#G$oI1ziU4 +_O͟??<<|S|}ϟګct!1!?zaC\\ :uF s%xivQ3 GCe?Uy8*IDAT|N 4HipRP*7 l!ɩWDCCBmUkrF2VVVw+hTZlkɿlL*Fr\3:Z*m4:|_31,aX kaj-iLMi&UjUvPTFM؛XY5`*UjXGѐѽ)VeX`0JZyyABo~kc͖Ŵm4JA1 nPU=}`2L)0 7$v y6 h0L6[{ٲs`a$"Qߐvޝj3T*GID"䃿 e89Ēdh XOy$1CYɱJu"8NxI0l~>~k32q>X|^HٳgXON~ ttf@㻥ީ|P]U4TU>' MnUv{:"D↑?Å Ϟ;sۻE$TV >5tɓ&[" tfcUvO{N8Oٿtڎ󎗧˴iSb1qrܽkW.ǩiÁ^|?oϡR|>v\|f$Ce.‚AJ  XTXHu`('B14U=mhG˗_V㗯\FmsνYrM??Ԕ+995"qR]7oׯm_[e,aXkVӛ.ЦMKn9}%jUU!:]8syWjD27 }k`uՂꋗ.w҃Ν;ǟ'&$Ye.l3g oϞ`%IΦz`V YB?^pܸq...D"CTֿ͒<ۍB]dbnA[FqqW kکustFJR ar!$^9&2z䨯pxeoooݻw'OF!};wL4<íۥ!T텷mh, ͷY>>|қS]'' tv2iB/?W=ⷺ %~sr"G#~C{޽;Gm44$  Gy\';w9BOOϦ M~"RSӌ,ឞ"GXq!dkkR#yY yʔ)٧NJ$8';;6vz!ICCVD"IHL4*dfaaa{Yrk |f}8{5"{J r?V``kx~~~@``4 0cǎ :x5H,!U]<HEE!peeeNNNWDӥR)m6ޅf_ʫl6PNeu#VY#zٳgϵr5igJJJJ%a*Od٥DLfbX6e:L6-sޚV{xF |M,g 1!{*(.n6w9L>˫RR15%E"K$d} I''\)bʕL1k_)J%I7~睟~qO?;9 hðu[R㏭U=mƽ6<=׬^{nO4:S8\AWlޮ"غm۟5~k#Fh6}۳o\?|BhL7M5[w*Z<n~ '0ÇaaL JiY{h=zammP`Fyeba uuu:uuZlQjucBtFWjUvJaP(m*t0LVT6תrZf0.ÁRS=z$:KjJ 8alq9mP `<4]Tq]iwfg:֮AaH1נ\~}P/P1K- i SEIKhi qp았XT\%-Ir81aÆ߾Cаu֭۶g"{֭[*XӬWZT B6礉i/~saaaN 9x鲨Fq&}Ϝ96'IKDod˖-}CCC׮][VVfH&,7 g͚/Oe#Nss/|3?0~)ҭ[]!T]-ܴicN'Q]]]HrBM~!Yrev):W;*nȑg,ѿ&MtիW܈HM /0LѴ˞H$pw.`YġgOCJ$;bcǎ Z4ZX>s[n;3000-}DT*!=zeR}fB͝;/--mA66,TyyhE'''<?ɥprr"TWVVh􂎐W*gϞܰ8#D'DvUFEF544&TVV[={1?y򤲲?3waCB#Gjll|}„KG˩oN ."8+/ONN6 !4a„˖=W|vجNcpDT1Bt&L~٪UqysoĄknj0lCsOipRa]t͛ccbD"Ù2eJRR"z7nz획 sȐ_~El!nTz"+T*QU_WV[Yi'>hmM ʻ굯19e}yk_콬5_jfES֏gy:ڴY-a2{S,Uk  `U=t`U:/jR i FP~UT =@RTjC{yNdgJsspfmkwV>h^9hgjuT6`ZJۻ9폝}PߐkWwFRK)ޮYv444xxy*B*ֶۃr67OU1!=h49NNRi#n!9NQaRHn߼RjwLGG6߲+x hO4\.S( \| BJJ.i4s)kQQ~~;mwiuuv-ݣۥ3gnoZN9䀿`,͛?-++\lQZUA~So߾15h=8xO|g̰~'6~BCl=%%"MjD:=fLjj/얪v!Zs5{ƵkVLlցî\$)]GTa nݾMHP0Ri $/-cjA-oNwtrtttJJ e˖0OfeU [n  g8Ⴝ}@%n!Jn*u,b̨%%t^WϵqrK$E3fbAa?%Ԟ=4+W8qFDvGo`MD.]|…yWݷj~ŀt #cl{zCCrrcLj4kb͚5O?~8߱WԔǏ# 2eʁ?9vJS0Ì'=%&}ޜ OAEwڂWǮDk#S^^~۷3 m'+VrpЯg,ZyڵMS]g=@,>{:Q]=!pqu.bHgmX,J%wusH$B^̿gjk>={ k4 ]FR!T~A.>m*U@}撢΅1mgQ֪H<[dƍz鴓6u~cٳ&M4zlfcк}8aNsr O|!TUY:z1 !HPQѫW/avv/<ȑ_1 5*BcFnP)ޥ<ڋeȎ~1s}gKú)!iJ21aE}}|J2b!>|D w׮/1 ;sߕ+Ϟ-kZdHlr!7WP֭[g͎'<j>]>s„ ƍ[nVR[vݺq1_bbcu߽w,1z0RG/]Vi({vJ1^2XݻX,8]Vi({BڲXHEP(\ԻҌT!: uM@i&ߩv]{*@W `U=tvVT*#``Hׯ+2=M{2چGg =4E]{7 "HR[*sA^|Tԅ>`@ӃJWG :%LܑdSÎQ_[ĥ' Nfg:1 IwEc G4`5 eV+ۻg'|\ IENDB`knc105/doc/cs/tkicker-cs.png0000644000175000017500000006076011436654001014075 0ustar dandanPNG  IHDRc~sRGBbKGD pHYs&cutIME *p'X IDATx}yeE{߫iFED\PaQ]@AMDGGEqaqTdAe2 ]޽#_MiU֭{3729%7FR w3qN U"""1k,!;3.B!Ĝ'ٲØQB`MP=  7L9)fMnD3K):"b*gM$AHX`" Y3ܙ*3}5t:U)p1Q06CUsʚ=Īiڶm)唳jέ䦱Nm btR)'0DDD͙y;c$""p XX3j lPP"5M f, pD$;h6笚RJDBSmLD1DSo&V5w1d \Ul*u-DCsj&ikf\XLM&%Pp80D1tLX@0ԍEN 3)I"(&{-mRYNw2Swg"3us",!7vw^b1"s1!&@I1D`0,'e r(M"XhSrSa*1n] Ek\- WDNwY59)\Īc"B2&hqK'w!e0HX e;P+,'W ADbfZVuw#w8<>ᶬx?^R<*U'5 0Н7€[w; K`k"3Y"ns6f3r['A0%bUffD2e,=$\E777"v:US2dFFq!Zjsf)g@L:$ Jbv38<+X,BD 3# 3SgbV!C]$0WB@z;kcj 0` ZyAq IAWlDX 91 A2K;*9WJ 5`s'8LA!H&1;fu9dd0sS "$:Jʫ $$Dcvx:Ԝ)Wj&]GveќpMmM33b 0#"mH8rXU&@S* "Oqw(!"DB&RNe;rND$ȉT uoS&kn6T6E 1T4YI5$6ifaP݉C DԲ3gw;AfY3a6DD{1p X Bf)6%,> "u]{p !sf Lf31+XNu]yU-F%2"sR>h %Lrr'/oHfS7sU{5qG f. "Dܲ׮(̫ʉ lw'Wj暳lTRέ)L3Ф$ejpbUqsSن3_tDwslf['XUQs֔c hi xf֩"8fל%31KtJY-ʷsc6Ȗ=njJmN b Ö-T3K;""!i. ^ӪsQJHL@y%18dsc6ΈnAJ.2(!LD/AK!,N CUD,g27vS샵E#6%peIYnZwcsnF42e&U%@DnjNPfidf1Rm@2YER$Y an!ƾZkۆ;z޼ 괙G/;Usn_B$u̪M4m/ʞ`͙)-fRMILdMe<՝N Xcc)̏\n˺QE8}LJ~Б/{~sb%"`q"0n"B4 ;*imOrjڔe[LUK8tgӒ65՜tkd?g|AC;}Ϙ{rs6udfs/bv8gMb"ʖT!\b?ڦ0*uc $p2@Tjd-/rnu[.Sjr#o{Vxu0Ջ{1r>۟uq/}^ws==gz3~Og˫-/99v> ܄䦦MnIkL=gH4t06'5+KA;ڔRJY̭쐅,i-+IE#*vߎ>lvGU >kN+N<\t/GXw>oa_|W?肅;)3u۴jm¯;gEWzyO+􂷏qg~߿o܄'!I#KB,e7Ĭ@ M90FfsjdHXUDB@1$v~YnYWUwF-85o^^O{;o;2ȗ"'>W~r𕟿Iߕ~y߶`l _ɿڍ9۴B(1Bb \wHjUt!6U%wy6˚F\@50 p , w=[hS<ꊏ//sO~է!Vz+| ̬-伷Y7OxYS8Ö[('zŭKodNn٦5sRyD΀kVrUP& KCYjT)P1+ՕKI6~.8 "jt{'r^.;n彧s?Q<rj:NyǢ%ەöj&,6:ڷrG/T7q-v˟YzݘMk5 2SwPu(0zV#w8望df@JS3Uo͓Qv6ԤϩIXK94Ǿ~Uu.xɥw3c'{AGɷOYOzܿ?g1tŶq7qϧ>f5O3tc6 FxJAÝ`Is~f-(ՔSA A(<22LsK >p'" Ud<inᏓ?s>}<1eK>SE<ȗ?t>9?fˑ'RNcMx=uy/~n8z?KtݘMhߴSiʹUr"i-eWj>.1*l8u6r#aRN w'x 8]swy {rx!^ӹu/ز-~sbUC.X}5l.FIr>Lq)Dã@<\ݒ߸@i~V-[ƚ~?>5z^jZA-YjsoS݌JpjSNw*DŽ MډC0&ܙYu6[[o{׾ԹukJ(-RJ(5`f1f"3K90Ѡ蟝! -DnnL@$l *Œ?tȼnF"Ԓ*\) ݜB".BU`朜 Ձg%ܩE"B7u\t6ވdpSA6!Pv&;`UDr)8(\.j0R'-ܶN(X\nEs`˿nmJ"93N.ekh&D(p/٬) :L^CsfLY`nP^bӂ-׿dd¸=Xz_]!?ȗֽcus<5LYMOTY(XU6f3 mB K̥p[x`.5wg &زL5~Ëu7v/:]??07ŕB€$ɔ\+bD er2ƁQ] qme˭ Sfgs|0Yڦ̰럽<н} *m;/x_ɩm6bM}EKB=_K7O7Ƶw:zY5x!䜎w+ow8-'9v]x}4ϮGy^۞G>M1QϪ$\zr63콱~j3KmJMKaQɬXRre%su5s3g/Op_?>v?s|g|n ޾qlͪ_{-7^;L1[?=+?_;=d[n5U~wW/4zk?r~?̦o$p%pcw3oөN۩H f;1 1WUUWs+ Aݓ*pI i),LmJmj}̰˻-ٮpI+> j%Ǿ߿򊍈=n =tAi|ՙ{cx#{O;[Aa<+?}{{̧:n˭>奱;+߲z%S߿ 1TU 1uUWۭHwV[m6 .]p獎tGFFϟ?P5x69е𖁹jӾg5_,;ݿ W޶mzm_<G T&?c梭-3cͪ9g~q![_)O.xmo['`=}# >glN -.~'tJ9%S1Ա@.e-kADefg.j*" \Cs..fclC[l֛>pˍ }#oxoT~?nնykz6:>z֩K MWw֬^?/\4^g?ƹg󇿴Y^WU s%dQ$7m߈SԶ9gfbt5) n+Dle6~l͚;cll倫6zSyCዏA=uW޾z==y{^} R7𧏼5{?y3 ͚U?s6(v~m})-;/\[qMuOcw³_ӖƳNџۜ&yy7#_v;V/_f5+׬}^w\{_n[VꏍY;֎^zo[m4MY Nh ^lռ0wGp՘LlGstΛ^vn^N})3O{_}Ҳ=<ׯ!ǟG_rO?iҁڳxg{/=~ G>==?C3~ n˵Kwo<s[ɱܲCMS6^aάB@[!5+ 7Wʹe3Yis.iwSKRmZ03W-7o|E?[r_ ݋mq'j 8as0}(9 G^3 ὗ-7"J1ئp>aKOܬ[r_7~sb\,22 dI@ e.a d0;Jp#p!/A{ٽ+[4pn{$S| 3}򙋷^:w73ʔ+3jpr 0: '";ADQ&1:YsmPTI_kVL+2pQKQdA *;ll_ս*1LD<7lc'9 3m VK0Q8礪$,!ud݈Ic7nnt~~7w] 1aNLq7)nb# ܅\ tDHlXBe{4\v)5?k? 7C nZ\mP{ADX$RdfmfjY5eW1UUMo#fawP#~ËJN?npΥ^|׮pnCF !W!ߵ9<9@w8WUUם捎> f H` b(|*oڷr>~~+E*|m'_u=.9>o!CAC076!rx/?a_3 *sN;z~ݴ6m۴M6YA03&uE`Ԭ9?Ӏdi,BntB"BB^H32񼽟񼫾I%y~~5BYɻ/֧vL 2Ji~򃯽U. ?^󞋾}?[~덛vPApcVvoIsT IDATK5qZIq :y~65IX$fq"'wt0;E;_}.-z⭗>A~1cN>s?9o[3r(p2Gɛo+>r;^]';Os;ottZ?(('N'Ar9d8v-sНv}]j[܊Yj3 @$(TͼȠ[`"!a 6(0kQCUuRNZ R*9"≤;E^q/~^u9o:abVm%[,z=xO7 CAC0ؽ|y_|K]ŁGlAmx[n$@&m6lAg(Z7 vۀ,P7AbanRV6笞iy-\pddd޼y󪪮CP7^ujO?&i/j]܂\ ztCr9d8 sx[/}y_/|3~̃gC?,Ʊ5/|g?(MGsB Xrw@j$nPu3HYՁU+o_|ڵmq"]x ٜ*m2zCNڦ$!d5bPVg7Ϲ԰y yAJ#%] 4iݝ@/"g rSͦnĝ_Nwѡ<님OAK@Pۜ!DRg);58 .U*5w0Tu;5JB$ !4YvD"BjjڔZyGcġ»#=';C7_ <늘OAKnӚ\SK)M5039Ef9j)B !iή9 ,!TS&3o6DL!;j]Pˡ'sflВ7A 666 /T`"qA  K!!q"֔~b &Dr7sjۜ[fq" LeohH:4q(.6rEll6h͛r\Dw{Q(1Z:J&&$8  11ܳzNl^X4+WY}G4mM3 m7"'74qtaa!bӱ_ѡG/b> Zrf)nsRb&{*VQASx$r&%%jA$S ;<^'{cu_0~ݟ/O7bE.6z䷿|I1ːf]nSnfe(*ZX\t`Bp d"0fp*"zꉇ5MfpͮL *FɪS,~9tm>ԣ؍pU E¨aP6^!ebt!kV+qgj!23qUUƜm\CH.Ӕai0 b Kl [LP C$QT9\' Dxany^9gDp[שdpj6  0a@hD'B 9܉umKNTv󈉃Df'1ggj($h@d"8 %H 8hBȈ( 3j&#f%)we+B@a9|m VgJ08Jz su6u8R+3s+PwSiLrI~/d[sQqܓ\-ąe/Hn;22ZЈ9(= 5ssȥ ja*R&99FeawwuM`_~vnMɗ'zSxdϮd P ';Hݑnw[ndޖ ]TBy#h3oNt)қXO;/]v]ҧS:Ȟ8yCc=Q{Nx~__~MyǾ::a]v{̿7g#(4CbB~s!cqr|6vDB"91"d檦e窮9m[v XTwG%vb| Q:֝n;Ruuw3:Z̓=D]'_1ؚˎzt3C'O;T2{( j }✲"*̓nϳ7FPhNwa/>3:҆^!Pժ˄DBB1p!f0-޸7-WUgttAUsV3X"^c n@vJw"ϳ+4XldPgc[/a;_ca_]rE߁) 7Bsc[msmsw .m%L{k׬՜ =IgUY֬I]\KScB,"QN'03Ti6gY,#ӳ{ɛgz튏w }ܲaCgPؾGpof"wh|p.(E Ȟb3Jjn;}=] )4?f#NqwiC/aY aqv"BF\rbRә !+``f D5Pw:T 7ڶo֌MOO{'M6=f*=q6jw?ξ)yǼ _>>&7?={Bs6lwiC҆^ x)d^b3S nP*Yp!ulZ6ݹ,סrҜM1/bSun)6P샏}?W/{QaCgo;׾O<׼! 5P ݿ UR+WTZ\\Z `~D w3[` B2vY9D0 ¿; oswb)!L笪+. %p+p30`d55XHP;D1"# H ''.s99[Rӄ0@Q.2`(;LKX$8(C뜕 HB5 u7g/E7DUUT5FM7KUo6-1p}pwΜhv:1 Da01S9YADjf5shu%3Xy*8l,#0@ND!219Eԍ&&B`DND 00Pp9msRL8ٔ]]݌ {n(XYU8 Bɜd&n[ڰ{yy1ץ{@Aj9&DPr LxԶQ9 -XP5m۶s(th_|[EDgN,^ D`"uo$H^7S@0%n9HT(~ަoڒYݐi'Dr# 7>Szk}:彼 $[|+?o~_g}ԣO<#gh{U& ̅]UMK\VsM*oBM_z˗zM/]wӟoX~-kW쏍Aq .Yxj.r FFGnN_:ꤷ\j78Y!yZ)7H| Rtf :9N8ݱ|N8mV.jN8_db^jk(5cLҫXb cw~ߴԦ7f5w\nnnmz;qfUvnݩ##Ssw}{}CY'\!yZlE.Rtf Y:ˡ3p(ݱ?y]qß}0Kys) bf9dF)[ʅ`fՕ̟?dv_v>otVF:#[7iRZV&ZC?˟`lug`q\r(B򞠵6T|]P̍N8fX71;#&k k,Q9ݡel".l"UGΈ8B]WDH-M.\v&WȂr-2]BZ克<^b̧cqB9!yOZlEhz ̍N8fX;_7s{&g;IA]ppUcQkp+C[Պ.3s0KbP5I75;x>,"DUe53;7MjB(\xppA` b5V^i RWb ff3Uuc_62q}Br?{+nw m,mtwyMh{{ȥW~ ڋ#R,H$!TUUŪb5o8YhږH͑&ԕ !wzZ!0Ln ɦM^O[>4P !CHnZZO=3^~Yۻ09jνz-3d'$MD!," .dQc*"м`>=Wս?nO=%{s櫾sVשSs<_꟟)POr @|S1@́681ۍ%?֍/Ap ˱_�`b10AG@fd -@@dK~0 !,!&QH4^<Nf۽\ptk{4SOZUVOXQ>UZm~K"0c12 Jj RJ:纞z#%@ )%~}l暚a*;Y'ͷ;=£O9߼u믖~23#Gz|ͥ^"̋xFi@"cf a糹\F8RQB:RI,%ފL&A0l&fl*d3a\ٸn5T/eXOI'1c|7}g_]݅OphS{wA݌t2Ϯ?k xQ\i,'HT2JҮd!A@ ! NB0B$$ ARP%WRMH:4&$cw̌ -a@g%N>um- ;~3+Oܛ>V9Ҋgw6__ڣN>+e^T?hD"ٕHe kR `R, …@! X=B)e9, q\\BH!RZւ[{Ҭ=|~y%5 g]EbuϞtƥv{5Įg'?mg\_cN9^p~z4-ZZ|k6f@J@`d^Z!IvY(BIBO 2h,SRh;mӺ[ѻkVB]qؕO,fR}[۟{z]7,m/j8?G\bh 0lr,7 0!4 Th2( ِ1J:D/yJJ!0 C HĚ!B!0̬!2$YiFd'#sQR`w dF &2D 1(&*XM}ƓJ )AZ$a;Ysu=)!P2@9lL'No/{=HEEf~PJ!lX$"pphԉF P1d1M? Bc %:&&c\(" bX x_x57?9yZ NJWd/ssV.şe24Hhʿo/0%~NȀ@JQmxr\!aLXDDĤƄ Qor\*d:#ĨEWI#+=W!d(^|UKH|]E6jIKeP(VsV~g_hמϸϝ_̣xE;FdƐ i"Ml I: BTRC!iF)WIWPjm1$C,-+)(D) b"!;;J}ō7;k'+|]E6jILP&sV~g_h$|#jkozի:,~r͏.!FX2f`&CҼbI (˅dR Ae9JL`idـ4Z3JAB bsq*9ϽiB>Vdֿ"x5 P&-.şe24R禫N:ںQ6n\l0"#PL,@JFVQ ס17@eyD6Mҩl'N$݉D"ɄaP>r&P H)'y D)g\k/:qנ_NJWd/JYMq&5S T qy 4r˜uw<Y6 % J1*B Z&{F$>` Ah@kC> a&"Ia.K3 $ !r !3R20hbS9qa_ʽS/~ +~W_ (e5ęN1bn_ƒ-w7H1\0\ |DL\#ȁr 1ƘИO{B$pQ0l?IF T,=T (Tj|MWxE?c8|#8eXZ$N:KMStkK˸q{с+W vqmZ޴X0a?!d9ow֞p(^[fߞ5׏z\>s=~׏nw5 E]7^qc}(;@::;o:2uԚxիeJLD* ^~ V~fnZwOZ;y֏]ZYO,`E<||.:ʛlYMߺ_?e=[3`f!̃7~']/?ԼO7iG2m#pV#lpa+I---ӦMԄAPeD$?O^OObμ[K*MbX!>m}{ w*-&PQ> ;&fL&6i䚚-tjQ]Y?Ԁ5Ů ֍s+zƟ>Wz3/Zk< ?hj8K/v֥?x}m0L'ދSEGvo˦gi\;zy+?;7=> bw^scD43zt6-3\"E#";lao-#`bQ^xQADEI2p8zO%:u?wo.}e]{XU`M3dS-i$"|8OyNy V{ვ--To}㯜}iO_ӯ`qĠC,}6 $hONZڊ+Ѵ~?vD"3b1lœ&gm]oYY;~+,>tp[X~^1~׭y/>s?o]1'oட\~.?SO]/M?Q}쎫<[;qusv6 ?~|wW[M1̗mim}-ؒ===LBϮ(f[T*>(ʷ|>DW[CcG}g_.?q۫̃.gI<YŖ~$^#4%T*5} eT* C23]dɼ.SKX4x<oz/ o|> Gaѵd*ň9LN<}%(we^/^ٹ= &co5JJatJ!ѨRxsx ?ҙY굎;Zn=ccƘ 7 gAqh73s&S__]ݰuk +W1c TMmmc l"Fc6?Fy^hSwEݢƨT*iƙ3gelp͗_(E+{7rX "vwwvB|3 /![xTw"a.L=ٽ\}xjZ))CI)m .0>ӦNzuɒ?}FP!9‰{E pjx nAv% { toYm\]{t>|7yӌ`l]5=Ѱ*M[۔mn^v\)yN?"A驩-FzZc>/TR}˦9R|/lFgGGw"Q[[[7A\) Qs}1s*;vlu"f~s3fXmQD% 0(e2'*I RSexVk[W]q05x[ƲoTuuuudj*[u]%%*$=ajuЀ˶(2o2T\D5KwhŲ_j0Ģاa2D"֚ڗ!cCDRVFB!^8 iZmc=g^lٖ"r!/R$4@xwƨ:~clM]!xDۤڭ5d E]Fw`lFSŤ :ej/aNsADa"F/})cL$-k p'R>bŊe4UZQzunh$8B-bƘK)(N}(cؖ'Ois&yl 1Q%==bqn`ӿ3^uORR ':@G5V#Hw=-w;#rl]΂Vg=<7ͻizW=Ltd*J礇uccoG>p5ﴴ뼈҆]+>Cd":㺉Ɔgr`;Mbz5ؑ2u744Xole60$D]*nqǝwq'O>xIvtq餉׬^MDRJoQ?^rĉDtڋDiC߹]ތ}yϭ]vsKرc-k׮RNmWE/6uZcSS} |>WptF =9kVo̴8;1v]FnD&\.MԠ$Uc{z݉nj`Æ\.'+̮Aib1DZAN0:Ldh0Du4Cu=.8;uNg\%ɮD 5 a -j39ӝp(qn,u^ G,= Q-r̪4pT /SGz.{lٲv)e}}="fi;+./14c[D]]]1F1)Į|ӗ,Ytٲvа{̘1CdqWjƍt Ne{p#[ V ZRt~r.8MKk{A= Hmgn9eR~meWdShGd&L}ڞODohpJ`+v$_O\[3g/_'B8:ؘ̜9svܓ{HH$4 ]9r!6;{^?ǎ[su&?}1`{1Ә6eV<w|#PM-5@'RHBibXjŀLfqFo0e*w;p`l]H47=Pff2vtw:ro O$cqip} e/q xOrD6en<2e{[2H$lhB)5f̘ qDq Rk{;x@fu8z7w2]v$  (=椙2.bl_/"HD"[jN&^z?:mc+̍FMk(q RRxc=lkob(hN]rIa ?LO?{۔r5ɕɔ)SLR1apa]ӣijj"jc)essskk_Cl2μ~vݽĚby1cXY3P;k"$"c@2L궙t]f^wX<ulǢѺŋX2 SrJ<ܸqc}CCO"j.*pnD8 _~PcQ)}h%s<_W>HӉYػ~rNR*?50xggon__<ܾܮa^M>veX|׻]./gcBG_ڬ?ׯ ߐ|un0v6Kݝ?z'ۿ?/Oz/l?xY?1W_~\jr(L@HVJHRj{h!4O=5RHiiEf1dsf("(3{1#C)2 S*1"":GEˎ Lm8>xպ={ @.//KҒH|r,Uj8g)W`w: aFmR,>}MT}C8Wp{8?aZ&x&i}ruٮA4OukJJ.2ȋU=ߠ4Ք*COX 4b*1!;@r ]py0S5Bx|zv~~lx85+?q:f};qrD~Z氿Kҏ=:!*m\vZeז>>< #c]hۮNVJXowysȣrq,c?4M7_|2nK*8R3ZAH@L 0dH"8N0%68ϥ$$&"FQِchϧ)RCL@"HI9zx(WX,Ͽ?'gg9aQlbӆӐ|;=⋯?`ɓ;]={[u;BPb@DD)9t*" A)hN)R"=Ox}`&ms^MLD LLLU  LT{xRR4fձ]]ԟ*z") YMMSa9K{n6x󨆇~8h\f^/|v]dQS_qڶ>R&Re-r4io&Rw db&ÚS,xS1gÇsNc mZsE~"RgkZ/&c9*8Ojffhjh M @f04y5ʹ|MLP#6>qX2sӭn1əEk:nZKQ0R C(LcRB㈙i>oV5ׂ&"Pø\/1=CmN/l۶]8]]l)Dxy޻@Vu_VuLT ٔs?bDb.TL a5,WxT->'Weշ%ǰ4 R)]&@9kߏGEOc(.x$Zص71#052Q1 1!"bV3d0OrJm'CȵB2Ô,Sc ]XPKfk#bvǰ!͝s ;1Kr'ժYxWaZ86!`j^"2;Bft0-nw]ߏ}B1"xplS2Wϟ>Xk9,܇?kT~_%;5* PwM)KU3S%T6xD=?; ;vG$""9Fr)gDͼsn3 *[_Df_C-笪1m$ yB T0)y漢T$"`F35B;,]]T,i8bYKCʵ 㔮m_믿|wYSlg4!}Oqi' }.6틗XFR朊2UL((U)cZUw(@F`h`>h5BB@d1HM fnAPR.d5⛯j2<3/{$ۼa\,R4s?mZ4{zb*mڶRR"J͈00\TM}H1b.u.FU2b42('rjŪ"! Z Sz}p8Cb 媍1RjfeR|$b#DB#dD@9{R LM$R 7Gߴ-17mlp8,W| jKhz,Zuxh|]=GcJ*j ƞمH:)\mkp< Hg\ƶiL hg>? _=]nsŝ?<>>C4 ?/铫+*'W9r3&ۋi9{oU>rp8R # ) X˚vMY]-zi(RҘpƦ&FRj5Q0GZjQ3$4 D5EDD37`XR.E21#v_2sV%"bT6tmڀJj k@sjsn72w~ {{ iZmlsagIP`B-)NC*j:T4fU.LS8?3"tLI،a* 8pq|9!E7T*-]lϚ|"=( TsCU(ls1AI5RkmۈtE]=Yblj^^ g=g?#0gɫW߾r|vMt*jd ǠMO!,Us04#2@`O{3DfΡPQ٥3ALTEѾ|,fWfUqZm+ェ2Įk@u޽~UM4R*1t_/Z,5518f0lZbSW8(\KQ3ޗT@_ CՇ}b x\Ǧ9ó8&Vu8@լ|[Ujr{Q.ЛA(b"?%G fPt8вkQU$SP3&UECLJ)]Wn^M* LTjXJi#?S$v\kEB0@S#RnTmBSRv1YT`_-%Q` oZ"w"`ʵPѪľ  E"? Am,MLUA|o/sbK-9cSZ/HHR 11;-9T" 1t\$@RQOʄMь]%!:v$B rJiVv]]8@$"2z\Z$4)@<{sxT xGڮ Sٞ@އz3`CiJq6z`G]ͥXxPsNmy%D"k6bY.~勔J@$*׊<Ķh)MbnѭVqs}w⋗::=s/~oo_^!`XԔLUٙ!;o7ro/{b'gb5)~0MղU,,*]cUC{ǎ0 JQR2sU@P:&J\3@*4-כG`@r"Z$LE3IĊE:DGhcRbJeݢZє29uTڶiɉUT\\]a wjdv0y~84DGZJ5;G>xJUfS]m9e#"s1an6gjO>U7͔Ӵh~8}:wmDn./n~ w/ڌ0L əg*sc<iJ)Fn2N3YFJ%%"f@kB6_s˻H'/^|{sh5UG"g}u=?{<v{sc5KXG?zГJΎHdc˫'a]ҴJ)󋳜uδn6sW㱔yVw1p&Mqz3)tm'7?w<4 m۪% f\< =3RTIEU̪*y6|VQ5eThP3?}oj@ƙg[-w.բS)Rj.up<2ly:!RXWFjV*!rQ**Up<{d@4! 9f#lHbq "3 "PS5&2mRE*]UF:`Unj. B@f3Tђ33R$ :]pEmZxyD{F5#&d4|U<,+&vfk`Rk)^yLMA *h48?ێ}O\'\,eY?MѴjQ"ba'm."/iH0Dpoh.R(bþoдn߃ԳnZs&G9 \?}o|8O_}닳0w_}ukVE7MIRXE4YSJ΀+CvE)BfZ 7\œLmi3QrB"7ۈV[@fgfU=/O>O_M5eGV7{|~O!.f bgڮ!B@14) ~pc)V٬<{%1 9S;N)zfZoooL}̸aSV̄BtPUJ4v ٬n^_ bzZJ-7MV*`@Df& JUklKQ?C9ާ&A$9DFE"Dt^$UBQ4V)\ ;BtNԈdQm#BEcbIC?NjZ.mx98Li V LZ!I5Gj>8$iR <<\CCmz5vRǀ `ҒLTT 433&0&$DddrEt9 "&"G˵4咕4\hU3=R}P IDAT4`:yfT :OeR)2}qE>KR4v499aRgOd:RzZR*kq7T4t˅zf^ޤ~wdYyaO<4!ێj)M"g?QZB{b֘ܜ&6bDzc\s`H(s8#5@TdUW(;0WJEDb2uMlV<{_'?w/jRj!\~ot8a q1%펫͚]l8!Vj$M8 {Bڮ(cϟ\~ =g׆jZ} O0Mܶ?|i LD 1C}ߏཫǦ'W*vi? { ڌfo,!9 j`j)4cU*dsh~֕y) ͈6~D4J@4î?fSSS|Ԫx8"YעTR睩8ˋ/"ˋ T&Ni(jPj;;9)(T'"4N5B]W~r8RSڟ|EbVqMsu&1iE+ ZgG=#"wZ] t~rjՔF#eG4͔ch;R M:}\4Ȉ883drETrR+)bv]b,)bp<j3:RֲXqޖR4-g'vS]A#|ĩaƜs>oWr},TR:mSZK)Gb@ *jBP r]lx!)LhsnnFHUEr3қ}hozfF4sLVA ZkŤCI "8YW'GgY Km֕|{x/ݓ'}IZ51LJ~tVFb8 gF|.{#\r*1w}7M hNV#@S1ĵ07)W3l_3I,mZQ RщX?/x,@IDsPjUw~Uzc"2ր)1eqTc`L3AJqb-]hqǔ8q? 0aE* sq990ͦi*0aNDk ٙI7C]`fDZDUBh\ 4!#? GP蛳3@P\?UZ\p<=s.Q3Y ɍj7c̓q.wt 䚒T9j053GYjY.VMׯ)4 iV]Ť(Yp|<+u]}GoZ5&R<盦l &C0@B)lyE}"6 пixf"P:WBGj Գ+5HUϦi^GNՐMSxsw7_O~ru9䥮׫˛Cڮ. t:omji7}rf<6Spw"rx:;x dJZ #-z}uu5= yM哫73E QMe*Q.ZCQi:)j:S?F1Zn>!;cj*&jUd*"WyNPD?"*̠jfoGsm6QU@@QESaijYADq\ʴ;6*pقi& A$bEy VZjʩsMv9~LُiBW^ (wH` Z9Œ VRɕ4iJe3@xܗTJ͈FLz8BbL#&SD"e@JU*4gB]!)Z)\r15,H?kͪŬq@Hf2ַk>Sj0Sd<`׻nΜ S&$\r.9۴;"c$$8R0tܹ/W^_Iě/Io^|q3>A۵1,t{tVMiλn98j-DDTJQGk-Lj5<,w1({@L}2s\M @R R t7@F8L)UhJgO}?|8>i:6m#Ml#~ӟ.WGQ ~ ߺ:;짟}qoony*PCӽ7cѵ0`\./Rjrqv@Ӣ՚󷯞>mG@5PT?c: ?/bYG p*R qv\Q:ol`*jԂHfj:{Po0WgsO03FD&_J1RT^]=ca<gӿ_>O_=::9T&R2M8 bd1,] tĈ0Z gI@o! !P.CL׀֫rR_zF]j-Ic=j(j]R"iD "1Qg=X*RױiK4&cɓMKDEWebgOLӔ䌀JV ES^ֱmj^[,)w]r] 5p`#$!6[LOwמqGTZ3=X̨̬[7n*q)w޶3hJИf+Ⱦ;6͞p?l;##Iblfno'gRh"){=r]<411no6~>iB/S^t#"n޸iA{nV7>&6yQPrcSw842  "!讞dDA"rbbh9X'LqFT@ 9%b`PA"A!*RMwp{hL@rYxӭ{FZ5ilAEx/"B( )\`f`Zib 'PHt6LHe*0MxÆ ;@ѱTlDCPZ`PvLIj !2rP$TTQ}}A{peIa"$&H@!x@B<%M*N]驙ĘR QcLZ)~OJ7o6&8} 1jb(*PvEޯe ( ACEpHPf7u0~jҬ$6 ˋuf'eȐ$26f=0f)'ग़Քta2I݌B|校z121ExZ&"˦,+E, /Kb212G& $֘Ilcc ":b=pxང`aP)&EްIYJt^J$"~o>O?iljs읟uzb&F 1S6urɒ* ^!/*lZiZK~ӝ?!xizb2kI#'4p nN}~ Ƙzs,YAL *DP H$x'HӅ( !hȫAB DT$&=Q!kqۛKJYz|ָ췆+jՇZw[n32ZMAF#/ѱ1FMvwOoڴO1y%P &&F%Udܹ{aUܚ_8plwO>܁ҕ6A2ZJ[m6mv\>mT F g<~ƙNj֒" 1G"ic}ss[t]!2H0EE% Rb-1+wأ`dZ7Jq2E'WU  ưm"bx;-B͛*i/`-[vVK5DU3%6cTRV{O91ŃnWH9P@ n?3Q+4M$-$gfNC?T5,7ntjJ╀-&^):Q\YHAXbF"dbÕJCqhe^<+a.μHP8&dCDT%19`(Se8=e~l֪ёcL^O$1FQ57ni% m;Wi?7 e%Zt!F+c//^`66[m֭NghA@D ۶}C7* qū s^TȗAH֐aPL4f@$]IB >N  dAD@C DZk) PbEacbp'sDHT}_TSUݯ-\֎&zV80)ݲo>}ZjIj4ͲtvӖ4}jua;6m&/KIBPhO™ALS3s|۩52EQ~jj^gC Px$D3RETPQ w\"c3tD J I6d,"*CWTQ)r)21"hStIc|pPT1xWn޴m[+NOot΍n۶n///WA1 *֫#A]Q~f6:[n$D5vxj f ̃tU^c&%I Z:i^ ~}_zm~42s#*Z%<2R[FǫJ:0?I6iѿn_4!hyٵX[fA zkcȔE7簆x!xC<0QDmSXţ 'IJh,)`,219" UJ=LN"6}@$Z)1+bPK_,oMMT> {{^•֦E5bFF\VRk,SRo|drSSӥ-OHyWV)<3B 3S3.$E켏61Y<3އ(t;wv{=X>ψXVOݱcddIlQˀTĩ=D@ * FS*e)(!H,$XqhbC<fQ"%$Q|RdY^t=ɿ3/ix_$XUPEk &&&&4X}Ĕf {vDPF4TI3V Ac&IBtޕڦvs 6lOk!z;o1@o, >HLVG$ 23RCPX'&_ysIĊ(|tp@ "|s@lXt.Va*:֚HY^ 3X"[^W*JZ_<2ĕJ+z HHflͲ:Q {61Al^xBޯݻN{Krvv8$ш~_w'@ *QCb hթhqlHPXNYe$J !Fo(DP(1Ic[<聮m)E@F:p IDATJPe "(^TAA HUF`T" 6FH^ҹ @xP7,IITQ ap瀔I;IRyԪ9XW{Et~|b2 $4zṵMC۷o|QA lm= qbiRV* )MLDf/Ptpp6,ۚ00)lu.R0 r! "e‰(3*G >xcIZ^#륊P:@,_Q "4VdZ E(~/*yYD'K%.gIb|^*ywI'[5[epL* %63d ӛAMQV`T}YޕUHAy<6:)K_: NjjZ5ҜI lݴ gX={رOUkpi]x޿Ʒ-XA _맟s=sڝ5Qk?Y{G"xc8 NÅH*TbxC{c!"PeN a_U@L10N01)h(s{$"Y9Z5Hۭ'e@H6@T#vd03T5p\Xn- hTP%D m/ajzzrz:IR* W:WEQygY6fF:PQ`@jG4MS}8xA0?7wK^w޷-]mtM+.[-Ν;Ν;w_k}߾q7oo9d_>n/W}kv;x1|D S;B!H'VL$ʊFVѥIcTUDo(:De+4Ӂ01$@DBy&%BBewfxIN<[wv`a1:2>9aT` .ְZ#q ?xݻvٷj{]H`fT kV+7&aNCTvezNJ$aD\:_{`aQ\%8^.]v]~|իֶ oTwڵk%":ÎJ>OW\119961|^󻿛f%/})|x`) =5FQ URc$HY8J(ADdgQٰAdUI!|UDI#\sieT( C0KS"R j7&'8KӔ :MPV9W·K,wzyv@As0_PΦZN8MM{XfRTTU%>ZE##|_GxlqT۷orr{!g6lURw}W^۷6ήse~n.xֳVٳ8!8.jE߇r& mhTPv% jTdD8 A 1R'=&D ^YcU95.u{{ݵ{ϼa yWpeqʩ۟o<6655qlt")"jF}$M2C*iV|!EYEGl6;7Ww:+:$F wW"$"@D!HPfBPkmd] C(^TQd ,hABr $E~oG ZIEevviݻjZE^șйPԛN–./5xzzt.E/te~iv_UtET+X rtyX;teiQwwG6ܴ|?)[ZZ+/(='Qxk_{W?Y /~,y7>>׽([K,Ϝ{IuY/{+yt!9JŐ(,kFcQEkcIlHQF**['6KTBYVIҔE~%sٔ^DPn{$ͬ1ePJ%KK ;w&&'6n`,n'gN J&6=̳,e *+MѱI@SVO!=.?eISfjF^"14Mwίx3y`b߼e Loذ=M7ݴ7. !سg DDI@VfD1iE"7"H`cV"MD" UT02rTy$2HQcmb؄K$4 {wykdubl;&''Hjr&-YCQ\촽K}z-Ac! 1 &369Ih UAWt< @AD޹n|qRKϔLOq<7t?gs9FxIܭkADT 8̈(A RH šJ;L{獍1>M 6qUE QO@; 1#}Pe-'"OORZ1iBb3U{4kw{I#vnZưFy[ "J F4M6RRjJAQ~7 6F_e#g(uYC oC (輂TBdTF "A@!k i%QQ񽞱V"/s-1 @0"  $d% YtF4zvgR fw 4#qy6&B\ WjuX4>184H3VLjeC@yQsI@ 8tA"A ^E4 eYD9&"9 >T$I5&>w^_:ؙ?_4t9FF6l8_Cl) 1ģz}[FHԽB,`6d) 1EXd{c$ADk"&M`Dc&WVqPH1e{^n<}$f{ii9Zf4U9/ղ,l.n !x@fYVFjѬR%hU4MS$2{|A&I j^X8X9e?ˆh!6"A(9UYY0 (ctHlW"*& p"$SXƏpjk6t08w"$rG !&2`( X}ѳbÛ1Skc6LO!x0I4f 0j$ETҚHdT/zsmukZ]`۽{CGИb!{l||LiZÑiؾ} 10O<"M(%lDU&ƙštLjeYnܸxvd0.8D+qXH DH,]dPOJv #82Ʊ1&xs"s@l_ۺukZㄈt;m[4!~Q|X Ԁ/`7A r b6%6" "k(Pb)=!!Zjz,C(jl6b!e"6ڔ(V )`f ]8ʓ074("J H%$f2$xb7r/Wn˅Ͼ(Tq?5~͛<.~' !)4ѱ&6Ɉ* EAA.U'_ʗ/l߾_}WvӦG }%/297oxfx]zz1-kSkRU舄ȑQ R(Q6z[nݲuk<ۭ<'Ie͛{C>S:k?-,q/yη-w\78p`x Ho?򑩩w}i)Z"F$U!b"dfc,13˚:=ot;ziRYi|)߾Q3Cs3zOA~d/#pH+dG O<~Sy[zoG୵]B$B !0kFg"j;WD9?!lzBN?h{߯͞={'&&?&!Y|[?詧[WP@c,"#h$Q}Y}==J!7}k~??>~kקi??;g?|u~E{/zы_'xUWb}/yɋ_.{;N}_|\ Ͽ/Wu]o{[7og_ޱf D8\ԧCH) !xn:t^{LO~266"P>?O?=ݟ3337^˯яel˛qۿ i^b}WxiPTusxNA P (AP> }zOEQat3QAĢ(W^=o6 pKl_XXikqM7ɇ[o0b-~O ʲXy"!&&鴻 Tm I'L?Ϝ[fywvM~pXٳkwؾctteoy:|>? bDEB]XITSĨ"@fg@@Ha 3zcmZ @DBHGYTE$J> 蘎j7x nٸn励v=7x ۶jG/P9b_<5?P[1 @]*FXd}'|i;NM IDATLB~宻ټeԔ/pgx7 C/%U d(II( W֙tV+gុc7eYܾklݲivZ<9oH6x!i4)\QJɒشf5ck\}DDٲh0[jVs? >j:3qjjrbbZ>Sb0 :8FTxm'vEZVXc:wxE9Dʗ44OC~k}{wPSZ`j,// E]3 !+= K&&&k1{t^/MaȄwtTJpYg?x>N=U&_h>s;TO;䳬W_P?AU<9k.TƂv!$4E#yn8za|cO/]t{uǴDGw?ƛ>.]wo?gmok4?-'?GT?u<_q|oL;6m>i %ߨۙ ۷m>S<-g=~Yo?S䦶O::w'xR6o/ܼe=2W;5~m\-]~Sԧ>~EO~_we9h?묳>.³>;Jls}u{RQ#<)Oyn.'=Imݶ~A[VF_Kor饗OuYgu6)}۶oҥV9ԩӿJ1}>/n̚% oժUO=t`/|5k_zɓ'^y {ug̛7?oos.x{q7nV̙3`׮Ot,^߯x͍?u:s_xbŋly֭Lr\ha͚5 _|ŴԋY^i)J裏 6qℌ>pafϲE###S:tX^]7;wֽ 9|o].@zVkKl#?C~%zl欙>q_QcbbF~QGGmmλ 6t:{;ٳgu'NkV3bŊGO7>!!vrvk]?eT+gׯEcǍ= _c*CMKԠnw;:{X?=j-G݋{w?*V12uQr.U,xNܹ/y\q+:'_N8sqTx.+iN c\4=;ˋ*#]tt*Dq~ 3g32Oy/^ܹuC馀vvӥ=iħz:: Ϊ\RFFF`WJ {Xb̙3׿̙ih r9eJ\)e𼓐OL~²^.YzRReUi`;PrԽxzUtO7tHf7#FHKkK0/_޵K`26+=u.';qglKss@IS%~?{~ƢE _}uAXXQ#[lY(]t;U P{iǏ2tصV/7&&\SҎEGG8q"&&&$wqc޴iӰ-[aǏ;ftBB|=Wl_/Nj āc~ p|;K||\ԴAaH+}%Nзoߙ?_)1[nq:vr@VVO|Pp;4;3;;;/\Nv7?7ߛ7u3 E!RܕA7_JUnoYȟuԙ5k'l3f)S{_]O>ycrৈ4eʔv~{:̘1#33333sϧÞ533+33+s;v s0V1uN;ի>3ec)<4~rN:=쿎K5MyXs={G狌c>vu=+3kŵk)KMKT"uok⥗^vg=utNNNIߵ%+&,\hՋ,QfeK|ӧOO> \aaȈ(Wk) ӕ7u2t4/|!ĉ> _)( &9r4 "RVLu5W/Y>Pq=]vʔ)]kװabbcu֭[CΪ_.Q* 2$dΓxbY͚58pPz6uZ|?xf͚N4u 2n8p@ӦMPƺ.{{+ZLvgL闥t\[Դc{7p]۳?u떘X|B޵xoz…~<&Oi=PÆ @?ICI1i~ ` HtUq{"MӬ[>q<-pɓ99M6(9XO_[Kޝ;w@ /XjZjjՆ?>q&{ҿ߱CTҦM`ڛoW8^eU+R}Q[,%!1ҦM"G 8*t~+EqPfǛSi.sK~~^|C{(>СCJEwy~zmAb~%ƹxXX޼i*5$R@ 0LCz8&,,,6&fݷ^n^Suk(fzxQFW`K!Br%1by9i8NwXXNn>D|B8ո$#VR9p&#C! .0ĥRJxу?swkR))񔯠R}dÆQOP0@k/y:Mϋ& c`}9߈^r0lzzVv,")w'>>!.66::⹻JJ6l\zf RJJ)H\peipgM %XCYוqylذQdZ>"JIr=sJi*/]0ϝe(4Tpq6N|٦۷o~ӦMWz2 ^].@$DE9u R|@OHYv7լU;>>v;ȑ#aG))SlڴiӦMe3fER"K.O=Ա{2>K/唭׺N>m挙3QR$z) ! 2,RHq.L +me1]wի_t:}>oNNu\ի_[%uިQM>}zر[nҤlR|.]u]]vJz,GtҥK=yΞ3NݺKԚx~v T$RUYDbWZSy5xkqdH) I@@j7yuT ]nn0gJTF?ݚ0aBzǎw7XڢyeձcNjNt:K %^#GRZ~^kݺuJJ_|dm۶MIIe .ڵ+~ ik>334Ygk׮u˗/*dH$;:wbEE:mڴ޸O>uW_GWO39GƀJR }`E_ׅBu|puCꙧ[&'wiTӦnӦu6ӦM/^Ҷ]N;e˒7hߡ}ΝVٽ{f\8o^ I}׮]1ނy' e .ܻooعsgXd|;wyd^{mӦM[Zʙ3gV^{8ur+doٺG;vlϞ=`={dO>PZYf:iČu 2tY2ܹs]ւkd̽nGYӧ/% |}+\7?,-:W'Gdq@LY넁0. +&V,#]Ŋs/Zz+ 2ϛٕ+W'O\0|[IXn4)##}k<93ߵ{… 7~iVO~ќ,kرk}Ni~rcF^|ߙ6u s_H.$S{6l` 6lǎ/8vw߿`={[n zrJiΝ;>3fLńXY*XG <{\- "C &D0MCJUS!gYHmE7aFO=_~ĈV[nL61bxAȑ.WN>_[:1ǻ]}zZd)9.߅cuԙ5{m߾駟neK-YBZKFLLL`Ңcb^]#"#[06n?ޤL-`e'0fo߾3fHJL[N'OK`)RPNI7p+iRYڈ+ƈ! g#ghJiH]wfLL̉' ӣiii1WJ:W=P &>|0 EʔJ駟׺Nz,i?a|ZE Y|~FFFFFF3СCfKX~_s8---m)!s.=uڴ:RQݺu/rΝ;tyN:=s+X$1KN[:%Ŀ6,S1&4ɸs!AYV22;B3~2ܥcR:t3{NVfFfFFߔڵo?ǩ̌f>^,1i{7oAVS֯_޵kq'MVZ߯a#>cƌnѢKs_Vb>}'{!C7o>qҤu:thLlLݻw_d->>~}k^I&Ϟ=EK2^buӧOoX]Ej}MM=vۭ ~m^zu=b%U-/7h}Wx5:RW D*% aۢI֭Z%pSyyM5+ ݶ[+V,']קk~x/}1O?mێ52oo:E()r5U7o\V_.6l0P"XjUZZ#[kԪYݡ*W-/]ƍC)k5dkˑ"9HJ0$ 8!+}NJJᇊ+;q3*=nw z!6l'CI$Ik.Rsd +@h&bR0'=#=#3+-턔&qX)J;|K=b[.Ï?M7>cǔ^&N^YO  {}|ϯTt0 ɩYEyjԨS~3gԮU޾moLwc>6|X\i#GLNNn֬c=`.ؾ}?MykV *QҹѽG;OD=8t_!E'N 5jh媕wygӦMs4*DEСCξ}/$uΜ٥޷oG@J7n {|iڞoޚ7~! tҔ-[>3Fwo]קNںu֭[O6-רQŋm۶SN_|h߾}Nl`: !=gvڶmbŊ@BfQOJDU 0\Cq4" phE꺮9.2x32Cf)`Ȕ{ow]u֍~uGY|իOq];ƭ5.49Np:CӜN".~>{s-m۬ok__x֭t~%?Xp<hܤ-[hm6ص{WM`1}~VZulAy?99t[  :4t98i⤐}N~wQXF=]_z.ߛ?pVZ0>mڴYr崩N;~G~y߷>𣎝BFQ@`7r??y [Č9jCnW^_~wY9X߼S5:!!!"""w{@$$E$$R! e)!z(??/:::?/:4̘p ?ȣvnٳg[z߾FlڸG~g۶w[l۝V,_p <߳{,YG $ݳgK/>쳯ڢ9E.v+/"/w|9a8}?[wǂJe3I)l`Y\VKN0aQ᪯O{)?8To_ +V;v3&dJ$ 2.`K,%_@ `ʕ*ש[>m߾];8Wgߟn\($RD @!)(ׄ4e}zs^w={߽>wM4 y~#gz{)ǏǛ4ibn]@RN3gю۟yfG ynDDDf׮[G@͛D %0M~;vZjcǎئM@ʕ<<y< QQ{a zvmsVR'NT)$ " 8,---&&m}z5kFRb7lsƦ۹#FBRH2uSץaR I*0 A6TǷD;To)O\\ʕ+-[l۶m֭p:\Sݕ+oj~wW90i{{͚5[nݰaCԒ/-zp:Nǃ] &N:r5K6@x?_nݺ^z5ݺuRiSJ):4qrcN?|jj255uƌxCT#vޭ%/J !!^zYJJΝ;okpඝ;wvرsgϞ9k씔Їk~Y3glߡC~E7T W^ܹrG;fx999g'$AI&HB"! (Ð!u ilݕL$J鐒K eĉsfn2y!n%21[l/=SVb޽F~n 0LmY)߷~zCkѢŤɓ[%'Nʃ v5o|A7xK=w5֭tS.g^.sKU_תq=Wzii?_FTr͛'#$)+j3dDH4VD=GtM*W..5_{u"#vo'[=]AU^,K= $Dd RPZ)B>Y'aOtLoiXײ\n5jxt8y 6.M=YS/d"R,byIB(R|[/7+_~0?t{= W Nf4IVl U"B@b &"@W(aX){Ca#}~ kԪEDD\(P|?jNK⌟;wýۻVy[~a7PW3 ( JR@`"RaJS0rtIenolT2Ns5ootرkn[n[lYΝvM!2eJ۶mv-K6m>T߅oگsUknlS9|Wr~wџձ%ܸq㫶+Əxby'I$2iHC_aJti꺮L (MLSR>S6?+VL:e3Oh xrXz'323[js_,`[pQn^ʕ.[tϷ{g-[XxkN+^^o\Ç-[xfVfv~v7JUnګW-Z"P|,wsνnz~jɫ^ߗ|~0RR)R4)//::0 +Ν;߿7qd =.6v~[b֭[lݼ$&edeOiܞY5߂G:<S7Arr2!hQ*߷{4k3Yo7|xu@ݻ_}Ս7j<}t+qgϜ}wy睓N-Xf;wfȈ5k6_~eH~j6}6o޼^.o/]G}t8_~b/@*N̥9œpgXN 4cʔ$e6D\թ{K¬OFԹ;.~Uڵ{ŗeezq{}K-Z>bc͛(H!/ӧ{ L֥ӂ@(R R0g!)PD)yXxӧSsw}׬bXNc~ɉ/`.̐.ɓ<~׭-o_/քX7u3GNg~bSWA&N y-7ߴm۶.] m۶rM'NRsюp-Ѭiu~@D͛5(cx#_:uZRF\\ܢ g1RH&)I )B@h1 !.gh݉'8!(๋Uy^;7'''##_j٢MܚS@ @*-xGx_sSf~fsveƮ]/׷y;煹YYYYs漐!"fϞ9k[]vYzkRg/m'=j7>,RI=OWZZÓ&Oԫs\d@X6@D oscYmU)1={~-G70M7]BqZbPNXKϙ/IkEbboy3go˼T;FSɝlү~7i2:n!6.TO`qR@ iEιBY!rf%$8[lz IDATyJ﷼y}mSoVz'5:VHJfp%w}ǎe/_|N=1 !qΐ H%Rpf-+`JE5Qp1Iy '@ Bqbb iI4M"er:iʁTe `ܡis4 `Lp Єp9]s_vA[j08Pv-[6l\"IHʐR*e0k θ@p"P@R2)MXxDDD37?)R2MSpH>5Mh `ZsBc> #<<|>`\4`Ęe"Gvw$ZYE$I)t_cƕTOTJ!)A*kJ*" i* 2M$)CR)94zM{*=3 gLC&cǡ pz!iCB5.,N*9y>r\VDxxLLT^T>? !5ƆiJ%`:0-pΔ"k1dGdB!R^_Jph a9h~#44g.Kh$Li`4 MkĐNMD&4Gy;we9\nSyyy$e\l8m\) -ߋҊaHȁ# dJ M L))Ep85M3uS)s{܂q 4~MaQQQege3LS)rrs~?(Ő9N5!Kcicaa>D(G#4$)]@t nMe @)2閝ha>s<O+\ Yt??/_I/麡υfe\pƄK!?qDժUU63+:tP6mzuڸ41r]`HIh* G0ΘLpK8.d 4"#QQќ10 |qP@y(ЄCif02 DSJwxJtTR7ME4 ni 9&H)9.DQN^)Mƹ fzYycȸ&iJLPd @0LS(иV>p~ߧ믲xX)5iĚ5kv@^POR*\ιp93XCUȑ 3iMF9ҥHJS4MSJəEB&И`RJӐȈp \0.MbJJp:uSg)kJJ)% #&98g&)&nDKEdu+T:cܐ" A5!P) iD'p4gK SL# %^/4nJJ"{dRʓNָFTіTս|UU{sN7 #roJ>Q$h0j@c&A0F@L4ɍ<@1a\*1^L|DP{WZkQn53ٵjcW{6= Oh*uQycx뮻;;^zc^ <$:#)3@$0H!JJ}f0X $BA-j`D@VV2S?o3 нR)TAD̑Us)4 D>zҫy P!UBUbˣeB(E rÐ0WT67PJג>$Ճ~g?G?Ї?a'vʿÇݷҵ<sYl] snnzncZq`2Eɤ lr -7n&j4b Lݎ|[͖\U.fl96I=Ǻ(֍H¡ U>{ߎ;=Лn‹~74>яVM_x+v nsSz^탶O~Srw_ uQuQG߶_?lf-h)W\~=io8 lpQG_~=)Oyiv7*b۽:#jNof, hktuum۷yםЁ` hDXﷴM?l\XU|۶߾[om[ݵcmum:EM8V4mg[zy|6:#Jd%#d-(B 򆕍6c9pb<,/-o\o2^c#èLV9wNnmjQQ=BU41@`5 A Wqdiۿڿ/`PCS%rm=,MƟ 疗&>w};C\So| |미⊏>)O <R284blTLр 0 1 YwzOݼ[sa 1IUԣ*T<&mSڔ]QBs).mJ(~C BD0ϧlE(Q@'}cNg;"FM5js63pӔ2 !3Z)YP]MK* ęc `2luvGȃ_3cԱ7q??g<9YZ*|{;|/}w°XWqm۷u?G~5\}˿/:׼6կY^^N>|Z!0OB;d>B8RD#fQTl) +@Z\d-v(P-O&6f,nvmPh#kkkM0l6VUm޵еD1F H)OIѡgլj Wv  yZ0#"U1k.9+#2s0yWzSCs3Dbr!2Ϲ9Og>g>_>v_O>9#ƍ?3?wxo/h. wo'|O~LqwŕW.=n㎓O9;kMPW޿ <4O69RC2sSrtXVdZBr];ۈ(Fq+H}.CarjvuHM݈mۺ2lx_J~g‹.zկ~~o[l91Rp7?(<'3ڶFo#s)pG %r g}[>O?#wxͼ!"iC#P d Bli%a"!_Bdb:+qt6m-16UUňI5gSU3'x,H9R}꘸!S]71V}yByJ}1wGs$bas0sfDb݌rJCxJ|fK`$4+HsQu"K1@pS}G_ﵾo֭'o ?tԓwlO  ??񏋁#"Q݊zUU]um}m`410B/ESv P 24uL@];7Fʆxr}HFNDLHhfDT)'U!r]WS(\fi #(>O1Vuݔg r`*N@@!h<%eܹ;ZV;nryOӟ?}3is hj0qપ"TĤnHAs2sDpAYC 1uCm껜R !x :]*HDdh$u3z 3Nl$b9|!pi94d&dF 2 Cl#00`"Y۰>'ljFPPI#3y9z@ܰiϙPfT:i6-JfTULUc"iuFJ:gBh{^AK鐒A`:p* 9  1pFB#Y$l%bJ4DMS & K}DBhh %u "DsJ\0jA$ LPAA3!k\%SSgE,H׵_%g55U!!'hpxH;wZdu! #!Gك uUZNrӢj $"33rb1(JRJιBD,pb)]]ASN "Es).!XżfU]Ūے3RZA1Y rsp$0#u3p@qb@awG:u'9 ,wn6DkfDrwWS&C͒SVM7G2E BBm۵4"sUZDsg:!SyssI9ykfV~zĪaJJo;!&Ĕ:T1N6f!r$@"Y8xt7+l֊4 ,&#* ꐋR1"D`>CU7jȠYM5+Oh4-OFqUټ),D]5Mb@y9tD}P$f$!9SUmRJѥ!!:͈309S$ȁEjt&]׫Nf% D@@RSdѤX!3OUդ:uAAmenrq#"/=!!]BUUz0 tm ̌]כknFxRJ.礥L9u"2ﺺSJMӰ{cDL)|v꩚YBV! \qC̪R u AE8@HA9u 3 $^ܙ~oJ-vϰghp7{-8ґ] z=" Y_{:y }N8An`sZK:w=}wϻekop]op IDAT׏pZ[Qsߪ(j>Xd`0I;( i)c$03 J1RWVV6m]ۥRk)t*Ad<^o# QR,Jziiyub!"sH8s"̚Kk66n*Eݽq@B8bjƀ$8j.@4ԁ]hv;[=^~s}wym;yv{dxPv_>~~)^Vb՘S#ELd,j1Y_LS*l@ƒ'"3#ゥ-xJ`cf`^\V ^"06,HC1MD@ͺTTM*Vh}L-RNZg`|ތJd:C]K޸aܺM}kM4MLrS璵d@D44! Z)^ `FUUD&34+ Vċ&yB"0׾dB@! TsG#1QwDKh\jiR`LXrw1"3U4$H<2  vJQ3gdYsJ$,U/Mb"n^J^u'a7˹C&aB tp34-FADՅJ <* 9ewU4 z:wK4贘(4`RQ%h"DU&ݐ923&ƪRLGJ&"@W! tP9um,[QX1K&YBct"&->4" :n@1Q6R̀x1sy AT-Pf*BUWRR.vN!$"B4bpc񸩫Tm 3QEXxba5Er' 6ɋ_V" .FH,vZUTѨC ,Z Pv0f%3yZ` TU &6>i;o s u12tͩygUs#a,Q_Jq7w03spw1+)%b`E mՋΦ󒵊FKrgmLM-8#0 _G;><tqkqavDBDR&D"aیpP M1T5dTXZD$YX]B`n`U1V֛M9j-(QgGwP<a!Ic%wKsZ  RW,,u}Je6QswF" 1 cb>?}|f#ݵKWk_5'=ɟ'^Ϡ(1Ha<E|vZBcv>}*Y+Zeuunݶm[q[oNٴepl\ul޵wؾmm]tyvwlZ433`B љbiF5G)Vtut5^#14È$`x4cƀ}y 3*4R,gPeg>3RS}SO=iO;S կ|ɟ'g>Ӹo?vG?i/8z/߉8 #abSͪC0X):R*%!R|`x#@jvBb$ RxRtjZ'2y0"Z6 py WWw0i10b ф%c bRJɚs$,LDU%\\C(nfq3nS'2{$AKJ(L"@ IKojY [W5!y)%Tr)Og;33WӒM-Էmv699"1 Ӿp=xxn=W^zG<_:sUvmwkqG?zͫok/?}=cM,tM?s?x^v[JK}?S?gg;>OΛ.pMp_?gXkU}^{C_kvQ+9?s8wU˿}駿/߲-6OE5cI}].,BcQA|4UuEAP]kԥ4mVo \E UTi*!8rN}כ*Qc*t@(!H,b3l[߰~7R581"BJݼkk;ڱcm: -i]}JV * tuu:[MWtj{Jp=| >oQGk'to}{y/x >t5\7|%^k w۶}W5~ի?ݾOկ|~yW_yԣvr!Gq?}ꓟx㗎 ^uU7?ꫫz^_S.hZ{ݹFu`bCt/L! !:#0 8y.Ŵ18!j i=P{MEKڼMUMݰB9r&&U%gtH}KYToCUU6 Ns hESUj6=kV:Y܅kCnIDK}޿Eo~[r~U3_rg>9YLl#NKK\sp/{N{ы^W^W:/kqz* Z2b݃ȠHDDKvpD4rPs-stpp0āƙ@3X |:]sai*XU&EAUWդ9=: u=70Քʎ܋AJxڠnfj^\a䔊jPDt7nX͍#/nndӃcu?~z+'|~3k7G<Ço/Ǻ-o9WLN>餽vӦn:|ݟ~O:~Wx ^ti'p®f~/ٱc_?ݾaMW^y-[OxJ3B>6].91:0 32 IBX:AX5u]UU5M3,,Guw-h&ufzieyyhi2^Y*λvڮ};O޹umrR-P5u$Ta4i&6*VSt4S;o|cmiץYϺo/dz9<naϻ?.88s[u{%^_֖͛_“]~9SOmӟ%56o-o9LOݞ3N;4w?fc!^s[{ok_{ޛ.|-[N9Ϗ /|Ig/m; Z?_.첯}kir{ gs֭[>O;my-=>SI'"$alX7p;k@C@e@(bhꆘMDdz(BJxx|mvH&UK]TJI9R LUm04arJ))N%g|`"ȪYKBH!c#j9UP!8iќ<>_WxOO<Ի_՛^>h4a`PUs֜R. Q"9fHM03U[4=D"@6Gs/]$$1*! 0S`fs\GfqwS#59`(U]xw,>RvMUcL>< .uL:ѐCC"D\Ժԥ|~WYb +4S-nDq}M ,1!H$FDL R67jZP{v"rpb $ .bnȈf6 SfK0JB1pH]ߧljPŸ4yqC$!,YSׇ:P G S1ͥj)D$@$!F:LDъ}BU=zk%p !D‚c!w͆@Ӻ(dH@^9X`! x.\ш$@FA TDԀP)*TAG3!b1ڕLDD." I-Cf$: &C' T|P0q ̮QT-gsux;PD0 5@$f$2B"8V$&q;Xv IDATejS`10dj5oST%0@3E#4B`y:01{DV%3U "&$&HL"*>i!挪c"1hT3X%M -5ObҴHHjZWJ?D?$DG}=̈T QL̤J)  ᴡ12pg*l%S'L7Vc TbC@qRQ*3=#5 55FQ0v;MeӌHл q,uYU2vޱ H66@#%h1az,k6&fe]J`LXG 2hIA@cK"+x$#r F B;Μo6EyR\}"JcAW:j1!cB6U#+\bӤwh4<75DވxGT$,U)Pg#hBb>1OU(+,TuR^YVuTCEJbQc BdRǹϐrGSr01硙"w.զhtΥ"ygX:Tur0+2U54`""(E` ToJձԢĨ" J o4v9P@34p@ Ȇu $FII1Jcػ}FjZȢiw&&:ё#S52UvwY@F @Ҩ[u+J(7UST:U]UCώ{;_f}AEBUce<hye!z]X[+r34u)f(>v¹}I>fM / LMj0KiADR&$1Q!CFbTka)ăjR0jtΓ9H*fyQeY#B}e>C 랪ugY@,˺EfYeNM^/TnyDĞ3vNU +Zסu{ *Qh4g"Ԍ, y+瞙>_~ͣ}>+̓bPD#TCs>IJLڿj ,S :BtA@OjVMںFH@$ &%C"VE"r (UBJU 2\#I %+s^5-=J(1JgbgY9U cr"!J Fϙ# 1&fq)O~5\sg\榛nku'^z׾<' /g;λ.sν};`ME7c~T/kSuy{}7.O.f烍fHǾ4֨BdD@&)IEe "3#$)jbhƀ T\拁f>ty cg@90y>˝Ϝc"pshkFASɱT'ԥPPס\Z1DA0B}o6F Ǿh}3314zGFn5 [T}>KFGq7.۷]r%|p5p/7n|>LRsr1aZl+K@GX L# bPHh00`*1 x;<˜k93F!Q #E"+#9L"ω{ODD쳜bD&?TAIcxĤ,\׼6=G./$7/zqJvw/kO:Zo;ܷsg}wŕWwpŕWC;j=" 991MZDY- uGi9 v)#dDJ4n̄2;D!u!dY=mBZUYDN w."B V :} T:NU$rQE1B" UCAu3H4ݳsס1JE)r|*FP"]5G3N?fz꩟'/83w>18>DպV^ݿ9pΡ!Gd$3cvf%`U&!Ws^D <<TQEY71!,JL,*Ԉ8s3'hhh&r, NL˪;UUQU3@J2B#"0aVU$X#*V( #Bc"$f~?uEyŋe/~fw|tW?ћƏ]%pʳNyސvw!F8c>^׽^_v_&Ƽi( BJ1DQSDi 0F%ZCPO1H ^3i$&s@Ib|=1` t["uEDDjP;fvyJ f1' Uwq""45Bʺ1sN`@f*裏GirWE8犢@$k\ ,c zF١G"SPS"vgc3GZV=pFY7^TU$Bf(D5Y"UE{F#3K/JuQcB Bfh6i̐ p@ mnEҌ!Ve!x8%7 5rasW{B}74O" `1A%#\u !$dH="h&1j]'\3hD9Kj!TLT QJ˝,sb jDQ0_5EvH*2"ӬriZHfAR1Q*Ĩ)q sYYVeU2""!"tӫgYb@'bQ-uKIED XBNTUch)"R#+<7Sn`̌b!$)l3Ӵt3p}ǣ`؀LE#TuY s#G+#E!IJ#6U3 4v->!P0$f*"{6P@pD P$A4ADL 1%%`FICѢ)"QόcTaq1A4VC65SCB` YI=5w};dH(ubH IWƪWcGD`B!*UU43f!"!"&6ts 0(R5SD NS.Zb$H4*hIb8PT eYTjQx4Sj,Ž$(:9&b"G>ԱJcPe&2U5gO.eT"aRCBb%ˋ<˲b(*`i9 %BC@O]!$kU2lj!.3C%"xb4'y'`$"LDDUy|ƞ+X"ܴ(/1k<ǣhZVu-f -8f26BEG9g"uE 8 724As):Tc#!0-E/|9IXEDLwfjZw 1YTy &%ogYCAZ J"XauU2=8v&\Y6Kyj0[:ER^PH곕e.Kꆸ{^?hp{,=>锋Y*}֣>5gin5S6=ZC޻( 15I5C5R$bL$ܐ{rGbb dHc01@r۶Ddbtdfͥ& `%;3$b] "C"U`fCdT"sb!:e+Ht:hɋKo$1J 2!# *,>)U\Q:O9EEr=Y>.7~9i-PG_{X{wlg>kpoʇ8}Ɠ')bj*?^]#eRO̜{G.LC hBٶuyv1(h@DFLȌ,VU"9rWSrL)W.rg^J * fX*ctV̢HY^٫{I ec UDE+&EOP$eC`&3m>x(!N"sT} gI @T L d_zeϜHF CCz-A{׽^qUW]]Khҗ|u`A;m766f{sK-۶ujȮ.Xao~0%i;b>};ѵP33t,\}۶߂}lgFԉM{K O8Gj=?N}M'|4*Hٔ${76?>訪& ufyAl~[&##cGGxL/ґ}{/xOH%|o|z;&?{W_ꗝ<) A_ӁoX8xL[ bnum[Ku}d:H1Q<YF:sٷVGe˯ѡs˲e\fwÛI;w*ً/>o{=_җƗd55~؂YqȺ7ebLCrv3_l^hݭ^@|?#igOmhE xOoeBQ>^Zp7*?" u]zK.vg_.6- {[fѼi;}um7t>9)AdL0y׷{G>w+&5?ܷ _04sS IDAT5̴;y;} /pӮ+VδLO<Ʉ~+_ g;veqoh&v  M@j03(jߺ|Om55)~_y>`:woi5 / 7/^ /|Bn?t>83)B(rf.zg>5hLV{?34o-HS-z!CCC[n]r%l޼yRX-\~{m_p͛8-bO [e "2;4:Spxv=3O?ݰ kY^bTi[bڵ=929OJwV1X0Uow?]BM+f3+ipwp"7w\yK+~|󪍛㜙zsw}{_g󒗾Ny)o|~_yudddկy׽ug^Wk_<كS {`'.2hL fuH`d j#agЪA-USmym i!ff!VbrX4x|gPCDFkm >5Vu9nT&|`Ԗ=,t[vQeC:i^ghh#J:KN:bgl0/Z8ׯholrH1o ;[x3 8.x׻h9%ꕯ|+_8psz9o}<c#eX0TLְ ̠!FE51˲C~>ީ0`j UBFuo?4HeO'Ë_vP ׵֕"e׾Áw&&M/il(]\ӫrv+B,!Tj& *ޮ1_wݫO9s\_0 {{ol7NV:797wr6F>io[k7wš  0ː8' DƻɠjQ;]@]3TltNH*M %tlN{52\wuPbme%)ѧg ep`x.YןaR0 ,R*5lөV*L (N2L[[J5/>kӭ:ܳ>$fʼn1{v9EKn6o߶9,6l+ay r2]@WR$"(JLPVPF(˖7S;dcB:kV~ [}Ku7?I@-*+{tْ :ӼeOVj=ʷ,ە6l*Z@BdȼMWV|~?af؋>}o,21DIF`A6M¦ = @@ 1Z!jsasX7 wOl469U:ͲԺΔv{{r Y p ~샿gcei;vᮛ8555s 3KnUuz:ɞtѸ}B:= ZCmPkB]3nE=S}[ƞo&x ]-CpNFi n@0ufS!'K ͬ E^IؙN5^E~) oD4>Zi55??Q׫{#v:j=$$)df! : SJ1͡01Y,ٱd裏vǞ.]vٱ}'pX~ۣ2N5AtUNѐ%z5TeXdF(d!1ɍq8+LfǞ`|,lԻד70mk1#1!֍tn'{0@MW ݎ h ƌ3&bY3;b=l uu D;vKfVni޼yvw3cӏ~qOǗ涑] l{`5R@L-K(u%JrS, Qorb9 KbߩHo fCDGfdf"spqhq>(ۺܰ~ ULzB 313+zǦh@D;bThTS3~k;xw-\i'pQGONNTunቭ|A _NU :Dz$^/Dveyҡ-w߿{+/Z 3U[ڌUKǼrͽѱꛗ=pZ f7ڢ6nt$;H\c^GTDT$ ^'?)r/kD:U>wY{.X7M^߽_Wx^V\?z^z<}"x˟eiW}6n;EO3yftou#my޹ԉ8Um۳N~h{Aܳ7.  -,SGB `q3L}R?z83/)˲yƍsH0;vL?SU= <_xM7(FVxš'~7b!k^dtu- |&/\1pU(dž^nP4O8鄝#cP%.̶/9xM;C^uw~O"s3W=מx {z{vΝ /::|ݢxh"%rcD444ONY'iLFFFB]gmcdnݖ Τu=gw V*uw\mUzFկ|eႅyksvZ{Y/_^Yww38#n>."K/>#g_*ܹspppJCb/y׼n7O|iavIAa"?Ӯǫ^P<; ׼l][l>^k/nb8(jTǠJUPԗ"D*!ojڊ EUURTD$K;!]fwzNw2{:A$_#9snƲ߯}g+9V8֫o7bɸqُ׽Ye{,`h5cDjquvvY!x&2Ѭ$#y $PP`<@MlZZZ*>:a\WDK{p>~c|ZOUgD">s&!ABۤH~vr~ª–[iӲRɤi<o0?nVpp 83 \q4\mwm ,0 @0@Hkf̨sz;hPewXdqc3ak@ܒtzjf .plo dYԩS풭vkf87T0t 74D+6m0&x>~}{*Do:z}r/'uu#2JEi1Qo}&eB:z,PEU2Jb4].9x<ǃ10ffNɶfU!cd_:dEU7^ݐl^ ZOx7r@7J `zzںuvv6y7 (˲ B㲨B ۘd,j6?tW D{R*:Fm4͡ye0p7i,gֈu4ɥy#;8۹cmJO"2=5v뉄. KNx8wP(462J0Q$|+}i^"tM#L!UNj8rቓ?:i_0dA <[^ܨ/f^x[ML,fRfQvJ'l6dZ\nr&N8<!B!_KGؗUxji>)Z {jV|::$UsO{~g|^}rT5o{M BP斖u@t`Y=͚!\EY1Ɲx.A1BkYA70b,;Y#:q%!leYi6 $u͡} BFFFr--PIG޲ysM];alt4Wb0/T\nddry lꓮ$W"|ߵ*JXXtN_riڵ`!ZBZ[[I4 MǦ"}zdMX֣["SON%f_/HPS,JUU^^^uՒQlቲ?|є]%]QJ#gŲB=sF@O}A:u]WUի()!*n vv\xtfbI!KzC?su6[4XSёQsssH$͸R#Iius͚3#}b1ꕽ,:|8quys (paaA$T0 !*:tO YeţmYQ3D5|Y2-6NJUF3̵9 ? 9 j0eU5M$Y%IrC=[TpIENDB`knc105/doc/cs/CMakeLists.txt0000644000175000017500000000015211436654001014055 0ustar dandan KDE4_CREATE_HANDBOOK( index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/cs SUBDIR knutclient ) knc105/doc/cs/msetting-cs.png0000644000175000017500000020061711436654001014270 0ustar dandanPNG  IHDRv pHYs&cu"tEXtDescriptionT?da okna: knutclientPX tEXtNzevNastaven UPS ? KNutClient05 IDATx}wTEar!Dɒ v `\F@0[]ߚ}洆5kZP3H 9N~ԭ½3 :0vթSNU9uow#Xq+n=HSҔ4)MMc4AI طKBr _ڐJD.6Uɟʵ 0[ xC)UWȯ¦Z!b8d֢T#M[EI&DjQQ yw-HgҠl7:3TںWuuW@i:}TQJ9HAp /z:%Ll@#>rH/ĻI#&Oăb 3g eA{@#Z [:tLBT #oԙ2*+kQJNYᔊʼ4RyTqElGU}H"<ÆR8UjX t&&bd8CuYb7%r&x<^S]!r+U5Ȳ,cxmMu,2Y&&0,1h+N_E eYD&9cQЂ9thDaqI, е R 7fUQMih4ݺyުkhh.,,jߡcNvv" cyZYKdu\zc4+؈EQ rMD^<ܟ7K ,@+Dq|IJ(NU@ŸR48lOdXoWeE&e⅄}掅RV҅ @c+"Lh})ۼ%˃{ب,WĶMXmK7eƞ-z Ax .le9 wb˖-}v16XV b2'߷oEI0C}۷kτe:c,+BQ@ wORw>۵ƹ+Ά( m UV^zuee%+cvSNil>al,@0y_r6emFӡ}⒒۷-_oٳrჺwi֍ɫAbM2%b+%|V7p7xIIlxSYRdWrY*Em[ՀY~D doB)slEC=N !Zt׫a -xN ;l(L 8`b`% -1V+4T0RO*aӤȽꚚ׺ͽP%j-J%!SP.Y*AJ"e[q[ sKKoe?8btx`wޭ+[RڭkX~֍`'+8;(i3k(g' .'hx%c~,r .k3Ɯ;G6^=l^Z@ZqdX\%3*=wtGPF2Odg%H#5h.F<)NjвYz ǟ0t0f;vk׮k׬H¢6ee"ښ()--)-pEeee S}0 )(,jSVm$8WѻbP֐CE,kb2,`NnbhW_g|=87WZrՄN}z 9O^}zbN;M}ZJ)밞"YzQ# /=N8](ѣ{Ϟ=DN#\'У{ݺ #0w>=2I+a߇geE06 ܒHˡt9*3Pٸט:țV|ɉ uvO'M)r,bMl-%ra+_prlSTс@EO l %80dQ Q5vìV(fL_MPW__q/V\rՄ H$>7o„ cǎt+~\H$tzy_vh]HB\'vz֯_vOX+)f IȺ?E}!RWJZ N;m޸Ad ]tf ꫯJEà``H162TWWhQϞu#v"%%Gue?rȡMYxs~:fX^:;/dj)Lq]^oc?1jȟV#4@< \yDYO3zm.]駟3VUնq>O1A;v8X<3 a}T,!`ݺq#c0j݁ScV'j5vm]ݘiHD{o}!Qh8GnɋB\P N̯I@`7XelȮ%L`P\P'+'NkwPDZr9;0wxqKltHkUU{%'AEs!9C!WHX… ;(}X,0&b.BH zٽ{M6|SN?Ĭ'fϞSVV&`]DBĉU `aۀeر~k |ůlNY6ׯc=6z@_瞻-*..3f 7ܐG)]x`ժUaC^xcŲe˙^z cرcuoSJkkk9f|:wnaA ?kرλҷOoeYݺu[}+V2u B]Yf},| 0  G54CgDYaJKKzz0`=4vzgOkѽY]@`u3ܵk׽GMzv،3D""tOvL3x00~+n7q]TT G ?bŵ55VeT8N>[t w$J`N&Щ biBw{K/lEp.SΉH+(*,LO<}%Κ5YOp %v"!`cN̈́J/GmV P[[QPHā){ohΒpFf,OL<+tcǎUU{o٭[{[ncw~!oܵk,//_l3<[^^lr \9UTT[ݻw?;ssYrE^ΝN8ᄢ¢g{0a-g~_"~㟾ꫩS&裏T3ydR6q +**Ɵ:n̘1C=zL6m<6,oOzTܝiӦ_z%s92B[ŠgF~Zgv:g~ njaaP<ԓwuיgn{' ^~:?+noPv98Q]dT+(VM/srJj'4j P+FcP!0V;;Jp-D_U?9ɧz>(++#ɣhڔ,E ɓ۫5g-$Fd5ڴ[v."J̙3_?}Y$bw%?Qrs@N$k]}]`TXP`ۉDceYC{1?4gp;?O_qU\p!xj1c-5 9~A8xPv%%%{}wn;v[oIP3 _V۶R]Q >u7aiO3J鞽{P1W!/\3yJfV%_/"Ŵiӳ;8ؼy*o)SJmH,߻MJٖх3QMMלDH$JX,w**JGUJXĻp  n 06ˆ2}Jm]:Btl(lºpGMSꋯz-%|#Gn8\=Q//~ƃ3!0r䨲UW^_, vN}6lmP0ܑ)gD6L! $LO^PXX8?1ǎg/ao͛3:lЫaXUV㌖ͷz)<87'lJ~ٳfbۻ~Azc ڽ{޽1N);v1m[ڵm #QqP^ 8iZܔiL{5v*b)y\8ឺb P@XL{ `W CnEICԹ9ŷQ=o:BPLtm5ۖv-þOQ̤P{Ln XI^,ʔt@# \PpnRїw܁Rueq(s#Vmϕdl}t"g-b 5!ԅ4F¡hUU{+++n.]`P8Q!BH( &]hG \wݴs9GaBBh4 ih ۷m{'EC&G;ēY cѨLc_1l5F¡+|/XP^^_xq ԱO߽{>:bDmCaǟ:gۢiO Ҷmݲe޼KJJpQ@Qaު¢"dŊNC 6t '3z߾}SHa6Oμp`Ҥ:e]w3Ӑ&C 9j̇v-Q;w5\=7l޼'N{Tc!!][6oeeeT3̤4*CV!D^?&LݤRoE=j qrj"tQw\68ɸbkF8QP JLx,"xvoĉqCρ|q^~K/\XX]t,cXc7BR9<&MTS]re?쳄!`=&uy@vm&M:v&RDY#}|xgyS}/?N) *+c$}Z$X_"ΝYas<.=v"}vO7;JÔ)SWZ)HdC3uSZw>Gq$A$//[&$///͘@)xOg]8xkj>7`V"v ['?h}]]}}c= Ǐ_2 ٳ'.YG:Tktt|{`0_7+Mr 1gp›7ooM#蚵kM&-P{555uu}]( 蜮7mԿ'a6D"HĢx,D" ㄯEIݾ}uu⯡@LFGHc$."h$hl"E"RH$*7tr~&FQ/8H,elQTbQAsx-Fch,qyY28/qb'\y|x xd<(YHR6a l+ࡰr\* ,p;QnD"&!1'L$Yd'G\)D" =!yyHOk< Q(hlh3fD6ھ[%b,{ 'Q&73}q>w_|`o.D`(p 梞~p!}bg K Q|8H]O ٝi{OF{x;\hMaQ*ClY'ֹLlj'zEqvhfnPӯm9\̍qZH5ZFhROʀ;j`~M 9XEo4@xCSRI G/X![÷@,~Q;e·5y-;$!}u]%)un2YXº VlJbmVC9*uCvFVRL83B):uLř ʪǗ|P> ΑcvX8g Q@! fdf,?#GJScc 00 223_x,> BHfV&RA۝t(HKBpfVĈ" )F1l o_$IDX,4 Xs>ӧON;gÌ#mܽrŊ3Gӂ"F.HvFDf ũ*I3'- 1Q~a(xFلxtX[Yx,x*ɉx)q&Ebf9B KQ Y@V؍X˲?S%f*3K͖G>S8z3Cԋw@,p1jl"8B|#Sp,qz̈ca8s}QJX(4x̙ݷoN:edd0ywWb` ۱S "UB5gΜ}v9##mD"w^G—0!Z#3EC[ΈlD2@!XG,bݯ˦cNZ '>~dPy}f 석vzGE"ƆEd5{aUj"TKE6,rWcQ|'4rxymHjy  TGA=0jY[hq+uy2Q`'+ Z'f#9Z}2}<78I584'1/ڼh hZ|Δ[k,6JyXF-Gn*80|d +Qt |N"~>8;;;WTϱh# BBB.œ0!xp4^Ϧfdd+DL7CYbGZ9ډx1;;+##nݾ}vb8caZm$Z=gN`V<&ňDƫAk5nYVG朚%)#3q׵ w|¹ ȳ eZ:^ƫ w8ک(n,[ͽTb0#c*{dX/4dNY8AL4YZDa0 V.N p8c nb / _!c-Z&9^BѨEDbA\n #5Y04Oҥ222222 3! y] m#^)r7Z[΁!'{c;_+C&GR9raQY UTbpGGU'!ĶyJglX$WGa&'V}lxl'eww8 M:ıkmaF;p)M[/1(9k|rK) R@CHi+lC 䨅O"g$:JEIfCJ Ttm$z.)}BטS).sMHRԵW%:$Gyyyx,qOe{[CRj&;mV7323󐐆z} ǃպ30&H-jbKRJpi*]ʌV#I{JW MD 5ВdJJd=KϠhCs#b~X jd I1"E UĺQ)7ф*Q)]8‰%A&]=*ST4#(G&5bk$.mm@E 1+k\8a-O Ԇ/\(S)EXJץ p@~FrXψR.ɌYnQ+ypL$u`B6Lɰ|6]\ lVRT R$źF%ST Tel8DW*rŧ)Mg+}TZ&™r?bn̢O$@Lp6(HNg@,Ji(R WzQ K~P(Ņu"ZbC'ȅYEBk%j狺,J)Sidcb|8A^8V q999x Qy"SgD]=fV9Ց5+~$&uS%Mi?K>ᦹwG(cYPIrŊ;Jm۶Uuph!:q3N2kq zFm @c3rzOKL=/H 1#x [)#YJy91U)(nc3 /dȧы/)C&01W¬X_] ^쭶@K KK+/.XQ ۤ6Nqw-6nqKyVOXn"Pԥ l)̞@0xly: \AtvˡtQ9Ϡc+L"Wy*)݋UH!x,}Ai5DRt"!0,q?<.i8Dv ӄsŎ02Tς"Go !lywc(7@<_6Eiex O'Ÿז71&-(w?mb6\2b8):">^è!_ *N@.U AE%xɤ3W7Vuqg=K4m3;PtCQZ`".B̠xQq/_B JbWDLҸpUJz`XL^A~)c:Sj]XwޣSȣ˗^ ιd˻:~ȱAITó0 6n$ί`]}wn HH[вm^wI4y '_0$' ]vÔs\P*4%Uy^-*LWeFDt`|ı|>'kY9|wA2&1f^fJܦ8 5`$}PT)QB g`-hY8o.# @Qؖ-A4 |-_61XbI^ \#m1+ $k 5˩x (yB)<9BJ*4Pa$MEy`o(o@*V&HGJ[WeL>@}XI)>GFON56ۿR-tPC\)bؓ=¢TE(HlaїGFŔLW h@1Q)2t $h m2 ;.i+#25T#ڵ}AtdFY t}v'Z Cf7M ZtuکPq+m^}^Sw\ްꃔ'a5bR> YG珬 YZ!V!M}Vׇrɵ C?ʊB+<.1B4鑦,i1zލةڲAܻD^'{&UǼ4-6)onIjeL$Q-G*{bl>I/EvgMhxC#`6)p]P.LuHJ͟5UZ]g~^oRD_/*]OvߗW_ULoFyʯ]#W[:k)RE\BTVnY zC}:81$%-F鸋c*?l{;W-(IjVBm/ n0Hu0L#|/ =DFSDS[T <Q[/SUe0.`_I1=H@㙓6Xaϟ9?c\Vo ez U`KU+N@'8'f˶_Nw)W7F]=#ze#a#b@Yu& ݈BhRu qsR)HSns_A\tvgLjQ:hH:,Zi4^SjKq(zFɴ֠n͝bD!Ǽ=LO)'xp W71wn9o|_ֽxZo>7Ѻp&~{C=mbJP9źL8R:8`BdҴB%0F|OXLfP8\z @*' |&Qf`26PJ eWl?z0Yub1@MA *JRhnA6c}!{ql+RAHMb-B=}$?Ӫ(#Hzt.{c:XDoLAɵ ٲE#0*i+uc9kgq#UEJ)etZwn]?PbA&5!/'\RK8 Hy;N`關RJAmy˃KR 4.R?πB /Eۀ0i+{J5B_PS}H,E31ܶ*M&[ Ut2+Dܐ RX=1 ؔ1̦<:$Pt3IG -9P5o*hʮx:)cǀbb ә5r &@t@H.A`"B+AOX]UG V;^ AHfRUݴq懦`U &.OrgjQ#:a5Q&|.&WkD!ָώEևs=I3iH^\1. cQ/E6 PX'8/1Le$9a &1kZ@'aSg%0UڟUq҅UO18噮4ȜA&O D]TC@ERt8!IM%U {T 0}LSJj*$Al/VXڸ|Uܳ@qWZؙBבvn5m nmΉK67)mSMAE+P)Ȇ  )9\:A| S(puxwj>jƎ1z7E[I{pD+9s咶譍ӽY 嗮pt#54˶Ьx6XC3j&)#4^HAOd@a(a2N)p+P&boUݮ{ &Sڿ^ 7( jll<wq^;Y_GPUt=n**i766sSj1e! ̲N"_cBV2]j揦/& n;[7[CibAC_n]h۽|m-R'XV oV׶{J|s)%ǜSоm2pՊo)m!9y.nD9x͵Nb*RCۏ9f2)n c*r%K ջnC$$ T3FLe$4:<(-Ch|CR}?K@;UXn'dlQ~ "Na PGvK8b8VGj]jqL x:kk9믿>77.\0W^M):t\8\bK,5 ׵[7|jjjƌ s>_|w^RRsϽT=tt2/3*<рޏ}k]T3^ .$&'C{4 +mW'=C:6l)/NCpnU~оkn<}P-{o:RȶBvIΊ~m$fӼ6#+?ϟ^mңAT7=JkS~AL(> L[os=%njzUVܹscؘѣY '~7{k׮[poDH[ &Nok[l$L2޼瞻M7ݴxɒ{/_y@dRqMSzͻ8ѣG?sC˯&N8_xy@X[o- a4?RGmc@VOWCDtۖ9Tsd,W1&W>EqT@zऀY* 7@cyS!cD}t8();;sJ!ƨ:/ẅǟڧW@KZo*:ȟ,/s_$+@2{cyCFu|xnVfbmkӵ>#ւ<| 8h@XJҩS; ;T7o0q"ٳѵ\=fhز|xlk&;;{1uCg1U__ eU3tG}T)JM֧Op8|LL8 _?\qeffIkOvPUj$Qfؿ?Mi❶O6r]Zq:*ФER`_(U68Ut!FjeP(qB$PڵںK~{>]Z^,v1K﫭fia.{et>O=}J")Ltv%=onGVZY__dVWU#KKK?ኯB6m`0(Mj6m@7a}3a5\C3L:w<;X>w gjB(#+򫯾*+--QN)ݵs'rBmtUánvaj>'uGj4RۥRkQΌ =l &\ h@}gD-&XpVg4VS=ǝb3rп837HwVG9oΡwiC; }T"'A']V\5~W1aWǡ>Jm޳ac'mKddV֟o./H$8b8N=us={wD|y17djx +*f>ȈG !gO?-X0ƌwq oᆊ3g(i'ÇceYƝs~hYhۮ-[>tnIIOQ_: s"?&L}ȧƮHRkq S¶ /77*O>~ի#`(zdCmٲY !77˜!|!L80jkj~>oޕWZ6}w@=%TQRN6'B)4^ebīPO ;4ezѕ0Izp&2 y-Pcm|_.jEܓxq-p~dJ WkwUWXV nUۉ{co|2Z,{;{KuХK-Az 'L9wu\r%bpg<K,! 43W^q'g|?{}]jC CI&effkcǎ4h\(ok ?̛Q+cäp yezhDǬ͢k3T,lLRt@<9oҹJ]> qGCϽt˨Mu{əw>Ïlao68- h#;;B/[QWe՗NX,BŖ/+Q~ZWuqyӧ R#KǝTBY;upWܪ: 2цȋ~ݷv9ժ٧^>oŦrLO=JNb Vb׼s1&԰wZ_,rɽw6nUY_u}Lx! Oj7%#򦦭q8 sײ5K[5i=)M`K9s%yH׬nvpzl4i6/>4{gjYiH܊s)yFe;|gV]vm+B__tOJ=_n4g= ijYz_fwjɢ7w/jώI™47%!a^l+̩nvmEb`QڐpC}O`v$EPqqa8+2<LSҔVEsG-ODqkO? wJΜOm}"fP5[ƆmE[p4j)MiJSڿ'[Ǐvuޠ߼Z<к}vVEUVVTf[pj)MiJSl;]Dl̜pY% ]*nÑk4)Mitp Ǯk߳Nާm(b'Yq ,jMj)MiJSĶ^P}wZE_o_im֯_$@xV`Ҕ4ɥzܩ\^5Uqg ,L j)MiJSگ(>h^CpҔ4)MĊ|iߠj1'CY+ j4)MiJ'Ql9)m4)Mi)zp @ZN+GiJSҔVJbfJ(5QiJS+N؃2dYZ[6xҔ4jh[۝޿++2mG5"f7o6]}L/~c4)Mig#d?>b4)M"jӮ ]_r:0Q%BUCO}YY`@K.Z&˶5Cw>k5]Gy ˗iO׶@NڥImiHLT0n@~Y^po}%5o~_Ŵ򙂛FrQ%zl1JclҔ4zjvKzI~==d%[m9u]yb+GM2hOuPJO5?qgRU[i[iRzd`|>~G,xƬX{≃ X;uǖg4)MiJSC,?*n?6-pE(ksbhžʳCV¦,k[&dK|c 'X@O.a/zx>ⷕ ˹|mA)MiJSZ?GI?TRE)}ttQ;d]2{iFfbeX T^2q`{u/*\ ^Boط.>3=uQ AxCy!,6"Ih'MiJSZ9aǿ_bб%tkY,JԮ8'x}>` EU-R1Se׎)b XW9+kZ4yLY8@fMyj^o[>iMSZ%UԬiM]}eYJiWjvvvV=aH*$;p W{.H".Uᵅ{jdoS^s21#eg-}X|e//}] ;d>_91۲iJS+}֮]ױS_Z4UWW]{y)5~jg×k%w}1m?3ј_^}eQmGpIW8a*!Foo>k{#E{"q{¿{4Amkx=x|iJS+;vva;vuIS P}}}nnmzOQ̻g{m#)68mg&kȡy'oXC7:>;ߟo>v_Z4_[/h͚5<&?@^|yN-|W?^_=Ω~^:_~7҂ ZPy> t믎vy֙glٲ駟qʲ2\"1Sk<(Nn!C;. owDcWhlh4F[D@ 7&lGMbhbbP〓c3o,ΐ'M۶sfquu5dΜ'M1;w+zLfeP0J :/_ڴqӽ{\%QNNNV 񁢢BiުhgqE9Һ 4[l4yrnݨTꮝ;Ǎs-Z|2\޴iѣٳ秂+V,ZITe=hUlY5l:VuUMǔI &N RTFE-miTR$q_~]/zxۿ T՛7o/t<7|naQ.7n;v۷ω'J5{)QKv?/z|yőU*czxG+W\[@T'NƆM:ÇC-2t%G2Si%ޭwc1YQj"=Oշ 3T9RC˭[dg:u  lۺufHիCq81d}zAzM7߿ D̋޵3fw n=z -\}5ōFvciE~:|СCcG^zu࠯X,+ebMud:bgJ8+&4J)k&'86ݦMe˖_8k.Hsfϙ4i̐p̙;b`VX9.m3 >DYLFFfFvv… ?^K`_Ξ=?kI&aH[#BLD ̏P/q́10`0TjZկJz4 6hr...之svv6yR- 4 fk֬ݵkΘͣ( IDAT.7{vXr7$++ˈNODFfV~~Θ}wK(8+9F6o^U└@rrH$"쒓S\]F=oѢņ Aܸy#rqK=ĆrhrD?55U,ֈRiӧ_Ҋ #{JŴi7.[AAA*褋gO!j8k֬JRt~V^vZ2pW_/Z/_[K&&kǁ e^1޽{ryzzu[v޽zֈ-.rL:%!!˗uiiqENѣuĉ浯Ll]c鶶%viS&Nrk((((00ɡ̷cڶk7i?|^DDdQG\ ڵƍE-51 \zoءn w-  _uT]@QnbRxp)X_.bhQoڴ)N"Sg%$$}5kL6JJHH+MgUiŚL&+((P(yyyPTT$qXXeWX<++S" k_͈5X\~Ǐ߹sɓ'/_8 AP>c+@ Z"BBC]ֽ{>_6YL,.?F`0cCTKШTQGqaȐzo8Naa%k4v#XoCi/@ * GՠhX:/QF&Ż`šaL& ?ORx|*jiuUBV+ Qui42DŽ{j"iii"]ėȨD݀Nk\払@UaWUZ ji˨3Lww;wKh; %Z44E 5x`xi_@ +1͛7/'bLѣO@ 80(c>|uJEsY NN  @֞=sJ1@-^L`>V0/ SGllhV_F D0SJ:ʉ(C_~ׯ?v5qjZ׽[|fB|"D9@^&2BZVTƣt*U~ΘX'Zn;ȓc̛ GJ%9ѱWе+XBaQKq\T:8: " 099ii FUB"L3G9!41* {MM[TV ZlV GxM>yՌu.:'$Tt?r&} r&d5Kn\V=D"??YVˊʍp6c^(Vzb%3'ٰؑe쌅9q0\*]AAX¦ŋfٻwۛ_Is,ڢU-E* SB!SwOb_8^=zj/bݦMs6hP 9cƌ7nlLL yݢE1cƴo޽{fSW&fU*SQF.+U*BC./ 2ԵaCJ% BS^:uX, +ܕ0r)n`5(6O9ҜD̛Jquux2,,lRPg ^3!49iifTbbNQU{EqNExq[_X|E &xT*QK.]T*R=e MEB=6kHNN ֹsN*7o2dHNw"No۷?zh~:u4lz5ײgϞ={v522RRW}ӧwAo}z3[e֐n*r]vۻwq`߰B.Z`o߿IVJL۷ˉ/E`|꾮8|5k[HsvN^nݺ-#=ɓqqq߿߶mJX`A``nn|w&|>ݻ_ڬ`̐Ç_|Kn֭',Z8yҤ?c?2Ž{׮]ѽҥK3gdeeo߾ø޻wx*:/[t۶mTs̙#GhC@} mٜ@`32u +1ZoD0֖44>|upnNE=ɓZtYfD"X<{Μ .+ÇϜgJ 8~8y~ı>_:td2yw\{{{6=jϟׄ,H$5k+""T"S#u[t;CYg Z! K^ȓ\ӛ5 rlVž{BYF=~J@U-JwPvv3y쒝e\HFFʕ6ldڻw-[Hsuw>xqϞd2Юqzݻwf +ܦdj8;;8geeW$)EDT-++K+te oio\W~tE A޿Beg޽kԨa!#١iS(G└@rJH$&i4\.gXCT̶7Q>ui | Ϲ\nQQ֔h<:: 7oDF.ѝ`UiLMMm+Pn֏ukH7[[[m򔔔 @@>Ϟ<ϋ׫ٓ'8lvv{EFa%׮]` u"uiz } i"k)k׮JRt5d{}{+˖-ݧwmz?`NPUP0L&;:/|ׯq'BQ)_N#H׭[۫W/ [cbzl- XTvJWBz"[S;85_Oج&͚ E)M,9pPK=z4 Fe e0+B:VôiĶb~$S ̿z횏رc;t@>}z庳^5jz'vAJѲ`wmIm|.>}f͚խ[M6/ZZnжmۯݯo?͔)S+Pn֏ukHS }~מhqM(ێ3N(p,P8d*Rz1ªmdlKA=ZyJ!?˗|LSE c h{a=~~`nKsG.:1Ҋ >@4pu7/oLl߻ש9NgX7QFh32هRKdRItW/)*rhZK6uŰB _T^ W.^4M [[ҨƙUWaE`p9T@ .\lѬkC7_>}mfW(eOZkn,f0 #^Mo[H/@XuqFJںu o7n}tȟÇ>|N]nU@P*:NR2?ΙXrH$6|ҥ^z8>7:훨%"Sq\T9:: E" 0YK? '''}*VHVebbqvvvNNP(T bۏgdfMK:wҹsaڴnUDEVlJVZZx&M<~󪸔UA_}{׮k̝k׮܄ǎ۵[7oO-]jҺ cTa4Veb##EǏ 4;7|Fpp y<ޒ%ii*J,EF."*g||<h4soҤ-hZj-e B!{/P)lU&`̞3g9z"}2,'yBӛhUDoмE1ߌ" Jј&vPTrhXDYHWO.#PK@l5a,60b ۾myn*\sIdH$OOАԋ;A> A|ukװ9l unwd~~t(իW_t gϙ`0~6I||!T*+._pF]|ys"X YܡA /Q(G9ڢEs2$$t9+VPT111ׯ"o=zBhȑww{W 5vw2d}/^c{w3m۶eddpѢ۶ ZǓq'~ݶoۑ#>} E// AT[yѢEHD)6m"68Phz"MFBulΝG! ԩSk̜ic#$"'w Ǐߟ # u #'M+,쫛7Y! x̮B/mB۪QZ-wҋ=z4:::&f<|p ϟd2xh@"'{ڶuknN["3P'''9+gcvv3y⒕Mgdd^jh?PYYZ...v*"˴2V4h֭3C|ޅ۶w^ݼ|  55^z䉭 dX *r޼ٳgKfk!yJJ*0'DXDQa/L"k(q's)T2L&uVCj*~ %\>znz~~~֮[h!]Xѻw6m訪? ^Xuk/o#b7mTA裢F":JmҤIdd$8^"9KҪp: 蚘m6C d={~1yd2pԩW/gϞSL3Ϝ9}fŊdwbʔ˗//5œT‹4 ́XlKA=Z3uiA1۱ mS~TħahoiEJ{^ bATj4*JѨT*ZT*@VWTӧ[dbl={n<ȱjР.((0$M~:` P <ٞTQ5RT0LZaFhFPԯ__VD"C7m B((E D)1(}]HP(]w]@G DљP\.Gsa.>(6qƹxj_ Fǎ;uT=>-dA7ƣtr`zBXbK~[[erE:222$ x>ERݸqb#ZJY$oɑOMe Q+ t>e2B Q(</%%]㸝S:gq߻v ?.[^wZLvV [nVE"y<^=~2ҞG*JRl6A*Ns\RVtPHիd2D"...gg/_&%%i4 6lhB-m,wW_2ȸ gs8NN))BCXkb%pg2@VK$FcccCk|$H&6k2K~mll… @ф7idܸq&Jر_eޘVO%a4M^^^["Yo"( gۑ"j8V&.p 0jԨѣG7i k|||fx]|3z FM^nܸyƍر LV"I% se^-D"!jȇEb2Xl>yd2 aa"H, u…r<|ٳsM…,F8|䈧'xSN}vtP$*ڕb232GG9uԬY9ӯ^rr*ðÏ88\vw^$aaiUՈ5xJRѨjFCکT*FC~aQ7n\{之KVvq!8] IDATkV^NgoVv6=|i˖d29]ƐYَ͡DVZ?޵兆zyyAoUNNupqviޢo]?3dfE$bZHJ^B2MEdxJr9%+oTʈٳgK$ga+kHII)!<<}TH8²uk0jHT}pv~br ༠a22+kKV`ꔩb[h'L< qݻO?'x̙+Vj_Օ3rѣG}Ys>?0PPP{O"߰>g)moCJN4 2th]UTj}3{-QKb7۶m;u4// W92))CO!j.DEculKA=Zy૝۲f&t #;;fڒlGY?ht;{6%e=M..g8}q㴃5{ ;:۷oǧ;g(Z>ySTD|egrSR7Z!o޼dxyt&6l6bgqXb X,vvvL\56{WWMULmi@I.&:::///++kÆ>>>Fbváz4W yCC1JOB}F3NzBA{ 7jfNw*I=.PӐ2C^899}5xR^ vkbU*ZV*8+JJP(pd8K'L&х\y@ f(޽k<2stppttdգ²|lbk{]ڗbqq\RV.T**tSNέ1hSF@0Ϡ"\^Ζ,X, пp]XK@ .lU6_!:5X8|"Rlbɟ^@ *veX{@@>('@ j,ȋ5 Κ.F ٩&4{Ѵ{p|K+@ D1~FqFfJZzՆh\#&!:ANՖVat:J5ZobNO݆?qc . W%|>t{)kv Aؾ=66699~q}7G !Wqrv ~@TBӫ5X(wzz߮6mѣ3Tj-ڻGX|իWuŋVcMQKhS+;;¢mڨq\&+:34{ǫR`bU*֭[ 6p…Р/^M2wn8 ķd`ll,bٓ&M^z?L,0B~~Aq/wDDmq6䜒"ViZobɎ_H4lKoZtǏ IW t:x))б6ZUGDDdEhakBP={L S(\gddfedf%xif@@7[1;w& zO}FJK|F%%%-ZB^j4s!HN:U(ƧtF┪RDF(rJ!6dGG-94*W(z77ZobV@ (KLL5i$X877C t*788ݻw3z7'N5j4yq[7vBhհTZ{*LLeG|poxA6D,E(ˎ 4y2q$?4oةӔ<{9xЂ S ! ~WeWjT"L|k,_|gW.nRX/W-7ogdj|1K*u9z7ׯÇt޽ܼj86Bq^|I^*˗ѣG+n[E /;}nL?_vuQ /JMII6׷[73R/=D^xѩS'khZ={֯_#J.W!*rI޽{߿rsr8*[}߾}zZR}hCvو "22a߾}Zmcٳg>}~㏟ӧ_f͛Æ ڵ_~yITHOTzEZm۶^B JBBq|ڵ;ujղ̙3 ,c޽%4m(9φ%"j997&/wlߑyرGO{JwJۯnބߵk+W|}}W,_QnhhXа .?յ |^||<xݽ\Q/ڟĉ8kz.~HBD"Qhhȅ r9sP(2KCBf "P43dXzd lw^2|7ob232GGLjd$#]}*ʩӧfs8Ӧ_zrřC{ՆA=zt\gY.\?W?n8XjչA:uru0aD.SR$HOO6,h4b-QlVu@lk;dw~JKK۷/hJ ,\$ەe˗  """ryq&9 aHZ^=HNN= **Y,撁*r~aaČ:GD̜ܹKg.[TT/wgn]]VCEۧLFYi!( SRR1G~cVLfU*+X$JK{B&7TF_Q7ov nݺt2^eT.#.vvv?mg ~MG H$vpp(ڑˊ֬]1/X `2)W~^ xdɓ'+!P~ǎNiJ ѥ 6HRhm̖-ZPmwV) )$'G!?BJmظ17''7'gÆ0Tbo޼qWROJQeAWHNNRկ^X0rE0/x ɜ6}Ztt6$((h{񄄄PLCRF.YsqdRЍ`.[LݧLֶUmxOO Wpf)nJ.Y9!FN4/۷Ѝ9r$v`JIڴm4l/&M&Nⰹ 6e˖V07TݲeŋRONQeQmڴ6;ov\ ْ~}{V2~x~3ƣ]Yaa~_d=3{}7#ht'RPĦ:xwWmXښ%{D%Xv忌C[NĝHNJ>w;u\zML 9qYYFӵ[[7oZZ8=2jT*d岲K8t 6~;K{\h6¼:x^,ްaر*jƍ>>>Փi5`k`d@Qn5q@ﭪnJ4 TtܙBWONN Q*^ޓ&g0qB?*իW h?v+NzR젔Ejj>Kz}Ml۷oWY :dP<$;`y𡭭jBjhtF~a7hU{ yQITΝ;ײEKna^<}ߧG[@Ѩꪏ`FRG #l'''Byӿ sppptp`Ue=&VVgddKҫ4T*A"T z(@ `0bX.[Z`Y<.baXU'[U(Ϟ=kCRQ0 0  0 8@;q0s*zm@p afXhRu5UzL,A2LRTJ 0a5Uj gd@V 7R0 ( @&Q(yqj( Q(BP(FC0 ?A 9/  dII@"lWK|[[[>fE Dձ6KekWT*U*aAT*x<DPFM"XH A0 puskԨhi4oh޼y|4v@ DU(1ԞZkZ R)0Ơ) M 1Oh4 7nLi?y\.@&@ x,fff Yɫ:Fp8uT*V,'Ґbָq㤤$ 3-["Q BV[NST SwĚJz%WO/ݲcCT կd2ISJRT.VT*EPشiS佝P'%8qggHCN>Rijr2NhZ54{f}K+Rnb'46JPTEXwdTj@ PՅEEmڶSqxd>gӼ\x\]ދeETʣo} cakkKg0d2hX p8R3L&$uB "^jpn4jK~mJV5Xרpi.]$NJT*UhcbR(`0d*]ΩnZ]XZbj&hccDZS b$e˒.D5C,nb=?EUy4M^^R$0P*;bD7/:uJuY8oش1wo?Wo=Rut%OLwcb!Ug'qߎ~g|Zz| B!4)JJÓ'O.\@[;b232/?>}LNm'޹s6'{tM5;(hszֵA7[#"|^߾} I_UV7#72{C!3fK|}|VXiCU|^{dqƛTAbbvHsN?>R@3I2{Z4onJRC ?xPWlmM->uj .:y䉓u#袷e%Əە۶?zH ڽ79~Xzz|3ʬ@jx6Ш~@Wu1%< !XLQ%Z 4:Xf#99iÆ ˖.#ג$xbHHH$aa/] )D"QHHȅg *:xг}{&Lr_h=:sczF49zʕ֯_ ={D"aX#F P]JVƝ##ĝ he r2wXJt".q~^)E0T9._" 3tŚǏgXzcǑo߾[ zN\XLffVT>H%;w.,,ޞ$P= ` k_S+ՂaɬߠZ TMe;3mF򢢢\B8^Q9yy -^pv!TD8;gggko99;;;eeei>ڲmϋ-*q333׬]n:97M<ԷO͚Ʒrh)[K}ܜ;?x$;;[s.͚7o~=݋Wm]L)vpp,% !ۂTL{mRmrsYbEl쏻wry!ݺy5i<_ +tLRS|dKLяam6k3\@nnnaaaaaR$VZM.{T* RT**`I\JD)yRJH$Ҷ6<%5U,7?bOy˗_%J2bP;T*#dmW~m9PWJyӿ=sl׮x|ܓSR>d^^ IDATȑ=zܢU+YVRM)Dkj,5P*r˥Yfk֬>w\ج+W6)%|KճʤR2<5$@EbrQ]]ӥx9' f7l?W-x;WKRsrrtML&S(r\VR.JXre/ztС쭞~=7HRTO{kM99Ҝ JV( d\Y^QF4߾}SkFѭ%~N:y_`?20e O.J7DGkchтFm߱wކԮh Uߦrsrrsr6nd( C5`^ p7o8gu6n0]z&[8(322V^e\lVX BDfZ<!._Ix{~~~nn+WRRR EFFFzzzbb˗/߿O{n t/k=r.CޚfFȈ&`ggmhtB VǕ8پ d⤉>/1£};ݘÇHNNhΐںRC3qD63/ ޲e Cb(/sv}m0n8W7QF c93 ={4ig{rf#ʂ ^yihmEy&&C6ڕz),,߻A&1=[[7]y#Wi4Zz삂ӹ\N=𨱯.=#cŖVҥK[f}m\N$'L6rĐǎEZz.߼y۽GL9NgX׮^m m`<퉵5pa*ʩ^2 lXƍ lҺ;KRǍWXXPزeKc j fv޼ysE†~;NRmڸǻz2 TʫW\U F{j=RXՅ\B,jDkkGvǷQTrٹ(33311J6k֌YZwDݢK. efH}s9\UyVFgH$|mfgN/V燂*5??T ǩT*LLL0]v^!E ,''' {ɝlV,X ql&lGp8tPg J^T%"5 <X$#Y,.b=GC*/FQ( i!hjNs8<-ZMr?Y,Qմֵ`05jt5}Ё\jhذ3m;@Td>eK4hd}%0dIX0Na5ן$ @ 'X@ ̉L&#Og, u,@t:JpLCj+-UEiUPq\..h*0 TD*nӺMĒXQ4#jM;Bm'D}͚x<.ouf/vˣh6mڴwO|3fFp0B_ j]ju}ٛ7oD-Y t2e=zX@~WBmi]֠P(Ķ.Rh"Ç47/N6n\4j/߼M ٲ6mҍ0|Ĉ~3AҞO81>>>f/_ڵ R4M^^]aauA ZFAA]^^FhZdA)Kp4$vڃ ٳ'2u*Ś:unsù\n@@$&5$FaѥTeƛI BnZW TJLPk4X2VobIS|=D"T$NNN@eϣhFh׶ٳg?Y!wMo%MҴޛҖQJ@ e+~LAYNp0D7KA 4I4ɽ? !MҴM:9J{=*%Am***t٘R .~~_vmNNeX!acvJGmv*ahzzztt]w [u[֯;yɓ'׭_g*0/'|b9J93mKIL˖-gvbK4;ҥAqqxÏ<~뉉E 2d&W+uN˗SZWڊ+ vT^tt?˗/;zAlu?vbM]֬]ff'̳>cǍ?nxk,8q=|_~e>+KoO9{QVQtbB: hчC^z] 0EÇ`ѣ,_L. 6ll亹;wv#gbcW'N0 TgO0N<M$ܷ}S[[? 2;99-zau-[l+?3x+VDKg_nMYt{ۿÆ }v8؄CӦo~UVy{{ yeeeǏg;;;lY EYf|_zQr9e붭S*{|A 0 CHΜ=;jHۦ5՗_M:o߾ɓ&}UR)r֮Yk~rFa_WTTԧ Db?̙3gϙKye+/#D"#tݽaC/d/:oF→Wzf =O=XؼGx(![Z76aaaHHu@pG1B??PR|>ߡp7o,VJ{'3g\~CAAFqtgg眜%%%[ESg}v={>cSp5eʔzﶮ,[u ;oog_/{{{{'NF}&+q| CCCϟϦϛ7|ܙ*gϞO=j,X?DV!-~-Ϛ5`%o>{tt* 'y1>4ЦBfl6}ɣhsrF-ۭnmzܴN;*UB|GGӧOW]JíX=zPbB!{B:vx׮6*y.~z!jVbw!B!c!UUu[,;88Ϗ;V*r8\ E"QQQ]]]iiihhhfffUUUTTT\\Դ !ZXlcDxxx^^MrK.ݺuꢢ"H$/_d/_ B{RmMHHxaaaJ0<<\$gjYYY#G,**ruu";B]b{`b1;*,,FD<`w'BXkm(={4DSH7n{kľb/WOמ}}\D!dF@Z˂CO>7[89DjVUjYL2ܝB:U͘tGW!3Zx%P'~Uג\\s۵ p:8dUꪣ>4ڒKL];p "=@H~H . BҭfIV;}J=]hQsyzx¼y5Ç;mڤ ZzIBrr?{-]uqэ?RRR nOK/cI;vV@!d'g+sp>|˫,33ٙVTTӣQZZT*j)))|>$(((lر+^}xn BZ-Ml4mEq-QOXذAp!E@ӴD"<deeeᕕ"s WTTFȮ]:XFR}\]]BQſ6[]]UVR?z%m`al# ?-^F&cg[* hhZOhu}}TAO( HO;;&nړ%}'Ć?$C1FEEFEDD,--jn'`74M뫫P'׻{{̓'}ZaO*--3fќEQMv+ʟݽ B7.MVqv믐eo\wn4`D| 98((0пHK EDDDTTT*uttpg#JB0&CP(TJeӯ`D| يZV,K$3VqDPXWW'F  /A!Z~B,MӺL\P@?] X,fS0"j5j85MGWuI9a :1=vӢ̨]e=XRut]:R[_84 o޺etڢ&SyF-; T[l][ ][v^2l3gSyv`?;-T__ou ir\w8r"~H|{$6M˧iz̘[NPxzxg5PKuT*fN9F#ׯpJJS\}zqA`Μ9};`//?<x>}O>ztB̜9fΜ1s B{^O8n{U*ejj.l̘ӦM OJJ4QwDdϩSL:3ȐJǏ2>^jY[%euMJطF;⢢s 8`A\[ZV\]f&7ZԚMV(*qР۟Y \.7**|!F3O8ۛiׯ_R3=`@P(xE-Ⱥ:y??[10ۑnܸt]w@XhHehrrrlȯ pGTpo6\ޱ5AqوƍFdӇϿEꎴσshI5M Ø/h ꕫUUUM`7:SRyok]Z3:}Btׯ7ܺ.$$$55@iI頸8Rtt3C7 ]kAApssurrbF5KbdepZ-{4r9[T]]n;*.п/SGh~|`BЊu@mzH O9x|xEEkZÃd/W r)~61**?h4!_bFF@ +J]^'NѨZťP(boifzEef3gJ>emAk:0ݑXB !!̙3}zx%7էO+WR~wBH>}ZW]f}cUN0go~kiZd׮ ONNVT<;'''88XPPey;IR77Դ [m#s1G3Λlh4[nTijW 8x:dsp.{GMݺe7> DO m3ۯԸ?f?[Z6//~-zK{BZ!IJ[ii6_kgۄE!UCea,D!p'a73BN~bqEߺvBzF-QG1' 1v_*CΆvi=zyz@y+!pmYؼuc "4$#4$Bz!_a}(嗎B!d\ ~bСCt/Ou׈n쮝;}zFo0֭[-H׿Asm;Buq],VVV:uܵ'=ܹ9y{><++kź?O/XկrժM `۶M7LvvNS7m6o~|G "j^ GVnj9*!AV=~+VD'@nn.}ڵ111|>9o5-/3>+}9 /, -n:-B!dXv3YfA~c???`y{ԅ w_Xh7H++^RRu[J!<=^z'/\8O cؿlq=ʬ&Bv+?D> ;L!7?VXR6n`*۬ٳ`*j#Yr)S IDATn,[2رc+/YŽZݻ?>U* >]$q\F#˫jE@ l{l %ZR={/ݘMoG?獖YvڵM988lٲu˖ BC[ՈD q aT*UA^Pغ'#:-Qӕvw_\RRRRWW{i:FjerYV+J;4RVV!=ze+ 얨+Ÿ{:yB??aJ#WajkkBBÔ E]]eoܐJ4M{yy-I2sss 4$OVTT 3KbRWhHH:3ku;mTk3O7~~)k9s̙3ka]49i]RRuM:u2;JR ¦nܼ#<|Z-u-+19q =<=S}11F@nnD"%&AAYrE޼ dM[:!?&vK:eJ*~f}KkC,RW'͟uuu^^^%E(Æ e_pзO_~};|0]=zd]ƾ/ݫ7EۻW̬Lu ;uo߾[nXAĊϼǎa[r -rX\-6.W\\]o޼f4βr77wyi499^^lF¾vqu5zȨ(dZ]XX07"SW[_5H3 v?]%Liyyy!}Z#Xt!D0Ba*U^uuuZZxcǎ0b]lF6ih4888 ~uQVl8$֦U~f؝ʂz;i Ð:"k2Ø[I$.]4hI?}ʔ)j&;VG.MkZ Zu={\pGXrrr۰n(J,8ԩSl+KqJիW vtEQ\.]RRL4iMӅE\.mWQQQr6r{KطNjuUUˎE"XZ\\TXX*nԩY[ [t?SINJ;7! | '7p]Q7ZuVzza\\.]QTnnlzP``ffRT*AAF y[ípԙY[&'%2 SW'|?na3ʕ+Vh';krN"₼<zԤ|?7'Ww948}.{r>>II2z{{űӆ՝>}BBtswsp \vK_?dL+W\&L(:l$yxxQ3:; 322BBCL5o|~޽{6vɿFh63m~M41!݁zyz*Kɗ{FF(iUʕEAAA^x?X[. ;"2UTXp+;χWիJK$R@ wtt4Z±Ưmհ[~B][…[`Wpܠ@':3FrBGIBVuEvbwm#-P%9 B777RR)C|@(TN[.NB,Ժ{Xu4qrD p?iDyQKYg[hJNJJMMTT89;jprxysF-z 7]>P~\qUI:%9s[ie%Hk 9!N0z7vl"d+9Hp:! _ҒvB!gmEGG&3 KJn?L4! w@#{ފurr 355pDin0x= ɡvGIn:>ܓ-d[B04,0tW!!PXCRyNSNj 0 h0@qx\.bְ5;-cB_t$ S.B*UJ>!rrrF.IEB%aD]=XBAOo܊:o^4B rJemM 0T@7[G %r9TWdgNm<+v綷V#"ZT*U*aFT(@HψH\vN[ȞVm܊綷05=z*:yr9 ;)=vM^^V~Jio/>}QyyyܫW/r$%993$8UmE]%dddTJx\nTTdP`nAgn{ޒξe䊝FaaYBU_ϡur9{";^~7_# &d>8h9Mlts3;GxKlzn^^D2jQ#GJ$<%BP($AVj:꼬-2 0n܈#*++tV-˗/;lL  ˺ݝ /@$eAur9{rrs 7nޜ0~{://r .}z:l^QzE]˺áBCBK}+4$á2.Pb̺q-2*4L%l~I5u6xomyߒ7P+?+a"..R).+,,Jb1A*@JzzM &UW6&VV¾vuqd 9}ldd_V5U E]eE?h4>^x`A3CS%Riڊ=X}Y060vurPN^ǎbzBVqI:aV.iZwpyy~~u9Vju}]"aHHOO7`XXUm%Ob|| KK nϾe#+(r 0ZB;10ur9Eb.κK2acXAM%+tttd34Qk-TFrNŋ!@NNN||Άa.kBtK{GEqi.Sw?|o6Rz5mp\.| :+9a( ~Eq(K{yziH ^캌"KS &32 ti5N55P]StBER\RLD9P'0д-Π+_%$w0 s)rt>ŀ:fduiX}d^@uܗ_wHޙ9ٷ}tz[U%::NQE丹~ss ?* ?3u-((haaaiiзO_+ݦBCe6-32{>l ч\MMwuu4'ۮXWs6$HyI^vGQCt4M;99׫TlkyI슌/*UJ'''__LjÖgϝ0a tW+pssphEZ: 0 ѝr-3gh˫_.-~Fo'ݹ3ufIkF!`G.8v+c*׾84V`D"wԫW)^; BBE"YZјYիWT>lhyP'D(京%DFDDFD4Mo5l Ԯ>v(;;֡8BelMs=<< eRbrppy(>A!E4W]r9/ 00Ó YafvcD|lnbwwϳthݵftHOq›ny{zUiqI  Klwg!6:nY}?IJ v@KP0(s98;DBDR]S^8( |}=<<\EFKtD6uhB2qyvKI 3^&E9GWW7RRF|>_ B\Z{n:>ivbo]nzD9'>1l4$B8-!{F0L3;[ll;; ߵkuLK`Kn*(!?IlP5ԽhB8(#=%jwIk ]?'MYGD☎-Q;kOXd9 !fj01M얨=5'ΞɎLp8aX!#=njjiQ1{&S[vLlNvB?n[rmƌ'OܽvpKn~vi-Q;kO]{X6q8P4~Ev',{e  yoQp]bGD0(RkbEQ%L(nڙ>i[ZV^]]+W8~/nso?<=U8lrB(^aD>vz,塹s׬}-;;7dٺu~>boݲa o? {7D"M5:W"];wzyzx{_7ߌNHW_j~{&̚9ɓи ۴435i7o/5-Q3'ۮNw2e 8+m6m0m9SNݴi|x}.55 RSS''Nn+yT^~կ~՗Vd tŋ_NI9}Lzzz+Zp]~/{n-o B!;!${g>|^L?77gM/$͝ };.֬]gϙc&///w7|-d\.aÆwf2 B!;! bKJJtoX?aa׌3t)&;vJN3f,\p~}x{yx-Ң+WqG;p@A~'S9!{Q0ٍPQQ租?JϝT*OBY%e^QTga~'/\8O A;kK,\xfڜ^1LMl48C kh[SSݷnذ>,,le1YgU*?GyTqoäg^Ȟ efvÇAo/VXR6nܠ_3O?W.//Jk׮iEhzzztt]w <Mi&!L]) xK讋]l9eǣmy1WԌ~=o 쭞a܁62c7GR뿛b&F=fLuUJ4^sus3׍*-.vpq^`!d-Y,>}ThhhV}Wj\JÕfwjerytVSWWg>Hz Bj5BlfZ#tt+-.̷Dhã^]ou*GMMɍho80̲e>tf7h`B,܊v(Uz0̞tf Wk*ahb]r cbc-]ܚ7逸ڹcv˶}}l޼A'IҥrV)Dgٲe={!!!'~U_jE!UT-[7v\Ϟ=oܸ5hmM5Mdxu͚ovuF(LV)֯:uWa7no7n4*!aTB¦Mo׳gA麱-j.Jz '~|SN:lCsv-˒b6j鹹PVV>xȐrə>}?܆j {3qrrzчoaֈ!dG仈ū׼o5UUUѳ'veG>ť%;v43mÚW_o}麱k;keǎؿ/r3MNS'ONHش KJ3ڨ#'%%sgx<޹Ĥw0|ڴi"G 8;;h5L_EFFMn ?~3vi)" {Cи( lpתصk,[g^W\=~?nݟvuu_z칳Q+-wqqGyxϞO-F6⧟~Ξ;9sΝ=IIS3Dxɧyz?8[1a~{lu:B0v_6_^ԫ-~?;sJxϤ⇍ 93YYYϾ4y{[x<[t' I/l|@j JQqy:"j >]T{%|ٞtР8S0ȦB ׯߘuͯ>C}(j4Z# ! o$9*!3-]3; Mg!XlVXTnnl6 @UjuU_YSWZ`*ww(**2S,ŋo m!(8h}99BCٵkG8uT3 4j6?`ue4'~>& "{~`(`brԸq{}iTZ)}ƏGDD|J7d'ͷgbLL:;;Z:k0|1~m[VKU[4V4I4ըÆ@ >>_ 6`ڊ;wY*͡W^++,uto/&?pU!0 k8EaD'b'@#=*; fϥ9cu2zg=ܦ?0}=:fg /^P(toYsfrMLk[S>|L&<"ɆfPڻߙ5sfhh:n~Y5Ç;~5BNz,y 0%%uju(F=2aB=f0? G$3ºrrr}!BE)WR|}9Mc | P{yùyfHpF/=f1(pP IDATyp%lٺ'P[m5jTWlB´}+CJ(tLr](2msˮ\  J:lѩ.І[ߌYUw\0FXy ! mk8Cis/?j^^bgTԔٳgϞ=k:C,2(`؍X(+ |(͗+ Bu}B6^b{=tjo(g'>/MT/J 8D( oVB]n-ږB0-aMO^bQ@( v ؟r]B! a;QEQacP N! a(1ڭ[m=Bn"s(" !#,B! !x2۷G!d1(FPE4e! FXj @%4MXdE1@!mB {k7cB%(0 (-BGpd {FXj)vӝv!ZX !M`E!lC,B!dbB!BXB&0"B6!! !M`E!lC,B!dbB!BXB&0"B6!! !M`E!lC,B!dbB!BXB&0"B6!! !M`E!lC,B!dbB!BXB&0"B6!! !M`E!lC,B!dbB!BXB&0"B6!! !M`E!lC,B!dbB!BXB&0"B6!!Hw"-,tHBuvܖN0/^DlQ!dޕBuxcGW!P3Zb}量N!Ea !RoLx;"! a^5 ^BȞN!M`E!lC,B!dbB!hN¾bS @ћQRD"H(6Ƴf}{,ML8&ZE5zgb[OBt ((BPݮQu@vE0.3m% m\WRqܞRC@Es{}1]űr2TW] հ2ؼ"j\6n(Ι5̫q<]tCfh7JPmÌu[cKVOSOpl *g⟉FJ2V& I{G.Ff,/Sц·P'7板?7077흯 +KfzG [q &L4^i57] &2W{35UclT&άusF!E!lC,B!dbB!BXB&ZyF1BZZbmGӴ%ֱ|!nf1VXFjZWJ+ \.kSE…lCwt]Z@ZYYX`׭pa15h:b8VPԵ>._J9:4m4.j,4d;;Fӵ:sKn]um,ƅc% njքXLjʷKB!F@\S6 2]F  \\\iѢꬬk`v EEEEc'gBC!5Ңyh4Phݯݰźnq0LMMBQg]jo'lf|qM*WzZ3cxYK5dee`p87;p8{VoN0АCv*jUun"VDfmMf&(''ZêշsZbU*eZXvDeHgNa4Lkj^VwjaB޽{֖aիFJ3gNo<={^qճ`JdhnѢBc"+x e˹KòBCӊiFQi?g'G+TVQXYxMxYšbŊgyfo6v}hS@ڵnCQ"1}ׯ=76mܰuK/Zꚞ={spY+ESnKTbkB/ׁ=-;Ng11^?뺷oF~ ,oϵk>_+M3lZ5[EQV,>%ɠ}m [h̞.6, ?nX!M+,h c=g9r:uw7憄,[JBh6]%pƍ~׆\-N5e{ƽ;Wp8ptt[vmXhh+f`9gVSQDϞXy8puG;:<-/, 1a!_~ 2eu G_K=xƭYjpںncDІvZ2[F9WÆ|pϗ$`{U-C5SO?4idZlucb{4˷} 9/_j7 )җ_ھcGu䤤˗t6=C"iyG?Tkׯ󽟿i9=…S/$}-x򤺒s<\?^I' k_;kwƿ>Hois2)SA׮_׽nUM[f4}GGx<ޑ{8x46Y˷nRR"{z}'% Or ݄*ի0pWWW232ƎC@f1YZ͛^d\&ӕb~ ֤JV^u/n1C^5kB/ed@i>~P\g{ݷߎNHۧϴS3M-v3.4d;~?|ݻRJJ+.2nbGiIVi&dΗ_~yxð/';we˖m߾#_?vGպʢ< +G(V(*Csge]3}i}k~"#"@ 'ik^.4N|{k+1K<3GDF7.,\pc]Ο {7t?|銊m۶~Yioٲ%W/gg.9^,GsGpl[VVV:}/\h&,,jFAWOy)f9@C#9\c] yzcǎֲokj;OO4ilqwwo\~ȑ?O,.)ѵߋ۷ǿꫦ;Ⱥv6m4elK>iǧ+ֽI-~7nXcYiՔ#?*!ҥѣuoGx?u#kn~lTtm5l֮YL_"iUBrcW_=m3a_TVV~Ǒf/M [Sߣkנql/iV=?%)z|OOD#}#SgJ28ҬfJJJڿo +W9ejW/_hQK_ͥfTB]40p>"GW.=qDct%zu5ifڢfQϿ2/TK4eUdYJVw5`{a nnn'L_L۷oߧN x|ΫV-֮ O>dFFpxuu˾/:Vx-[zf]Dp>[RZ^W}>Jvuo]⚚]g[fͦ-]Y|uƍK*իJ3?J57>pC17"#"#G}ʕ͛77}1[#bS IE3+*v [DVx7ieq~Nuvrrxm۶9x _b"*%?M7f1r\QK{S GEQ4`41k;v.[ g})MOKg/բ(JW@i|QQQH$@DB2߯E:@iiɓ0䊊 ]afkbڂ C4J5@]IfMNZN.#7&Ÿr{7IȋҞe-'{7 /߉NL4¿VZIuKR+4eee֭߹k'i@И?F;:9Gߥ!QnjOcz4SE\U]p/jgg. _|=}fɢVQG'aPߔҊ!}^tjRhTQbu;ocB/*3+i M}_6QM-fIN @ޥKb$_x'-||{{%|cLZp͔V]]oA6/oo?>H$rZѣd1[yNB;:)>OGJzR,YMII HdǏi4/:vȂKh뇛;7Y cYMMgGm7qô+lxks 8)&쫿c,s|x\SyÇccùe9s BsS}^:˜ 6xa^._`p%e~XX8ƣG*wJz JDU剪D,ZtM]w7IJ>dNj͗u^b>/^8o~21}5Kg,N@}3oOV 8+JKKsꔙaN>]VVޭeS _}՜s ewvKwHXڄqo kJY;<H;qZf*::z޽F]˗\߆##t1 *icZָ,͛{l=<[BZܹ>`nNcaZnVmqj0{  RΣ|/PB ދE,yGm%%Jr%IJ)JLRffdL8zڵkj:||h0L$ۊ&60)7V{>.6( J)B]^̽\jUԄ O-\0'--lX iUTn,8{x /7>"ݵe]OsM_μ bӦ-ś''%o.***R*E,dzᦢ+WVWWYws[{pK> Ӧ7SiFb %|VQ.P;ݕXΚ5s5I;_߱c>%gmGIpszʕLF:-ڦW%~>zJPB!Ym!a,b1uMjkWLL̅ |4!I/6EͲn9{3p WO<>hvL4MK8p@խy3ЀxX]Wj6O_%]awc/-?j #Z>G''L &$»x p;OsmYfyY*?y99@U`Nwr2|,Bn2 P,LߍvdBx8˖zۑf%݌y8A,!c) 9wJgϙOQtuu߿oT:ƹ{)/+M|("Y3\Avvu'" Ĩ{LAIW{|̢GH+&.ZijZ4RL=by81>y1l23Ps;k۝!h4yk .AQcqIcnY{nݐJq6s^rʫcƄ:J >ރBð?.,NǻvwxB))^T}~pT _m*y8NWlT Ꮃ = m0X Ä4}RX(b,#""WgզScWx_26kẊקpb"I~Wƍw"2P⛯>s9>xa"bgHw3\!7B)x>yķ͌ IwNmG"vzϻ X,BGնl4iRdTo 8MuuY4<<\(t~^QEFE q Ag6Hn.@8.xz3vrzkk`!bL&*AD݇;   ^os?݉I$$M&K!D"EQ.|p'4?#ABwsqa/(0i/Md   g25 ^Ap<G! b! b! b! b!%=!xylBkwM )@bgn wh)g,&xc{jjZC&|;}Kl4<_IDATO׷^b d4VS'd24e ğI:?w$F<@"IRlEdS+:ˢگ^D@(l;jHf.pWDm:OpVIENDB`knc105/doc/cs/usetting-cs.png0000644000175000017500000014013711436654001014300 0ustar dandanPNG  IHDRv pHYs&cu"tEXtDescriptionT?da okna: knutclientPX tEXtNzevNastaven UPS ? KNutClient05 IDATx]wTE~3]vXdʒTP Sxh:SQπ ~KzfLJP@.lޝGWޛ%Sgx]]]]]ߪ~ofMZ(E)JQRx*M-a;gF: PG6dDR!)eUr_YCg-,L)a<+I~asZ!b8d2ށT#M!bfYnE96v.o1/޼ Zv<#*I{UW`Z׍p^G ԑ ЉBSx`?3(,G!$[B(@׊~4bD<(60>HA-h(P rUBԩ` lXΔWY>eCr|F)<:eS*v(HQR7jVHUM#5Ara*;1jMrbJt+kPɃWIb6ד U˪/;V ߼x+DḂƙ{4˲bxUuU4 'oƎ wt@a aT UJt8^2p0F(U7az*v_SK (JҒp1?;^ SJmTəDdL<.\Uo萍:(HaJx.NYXwu5#Z}Ex p԰\h+ALL^L6,A.qnRKdL/mڰml%U⚼ {?}Ą. k-cˊD?Ӯ]5?n.;+˶mѶ霏P$Ȝ<_ЦML&D'@ nؼi.u6K.62eYhdӦM&l%k/ n GhyQQJ-˲,k׮+V5UUUmB232rrs;wңGֱX E1?Lm*@22D/QPU:5/#Vu /C;q/b.Xq/Z۱r=8Р]xOBK #6,X4@qsRbt8罎&\g_rdza MDμ 1`٪9 \Šb _@f#c*%nA[F.4d;Sw6Px;˗{=۴nD!IJ,+YcٳuIxz?k֬)//g%]|ХKSJJ&B oZEqC.iݼr_VX1;w~XΝ db-Ţ#l}19k3`%o~n$GE8# +N ,_0P.K徨m+]0 ! ](eT6hI$DTzU=Lװa5`aer8/׸Y$AC d7[^cWh`#UðͧI {55u{:Jxz[䏾G2, m%gW- |P6%UVVn˅zh7;]I~i7/,*غu $K@ ] 4S5".!ƍ?ak˖_Vʰ0Dh@|Un_/U _Na¢^}[?Q;/g.5y$bWhx,y dG2h*S= s #FL8I`mhtϫxm"[VNx8=SsnzJi` X7|t::J*.T kA[QxR(X؋W2"(¸1kizjMQÆᅬGUB;3PJm}G9NGzm,KvVZ94(QkYӝ4@z-˪\5k~qˆ0mݺUV{Y?Q;ybA`UuG88j)cuM)LB Zb1u4 /NU.AX(°կѦ1ڵ(>ȧ-./@ft͚իVuv<ٶxر]~?bQeaɽ{ӧy+J\KF ^zu9]x!L") yÆ4i2!ѽGBѽ[OnvލuԑrsMM cǎk_=4pg(cvףoVK)Ю]U=k֬9昣{tsuЮ]=](ҥs׮]DN#\'ХsΝ: #0[n:Ȯ]:W:nE#𬱬f[ vhH($بUӄƤQF޴KN=yg^~: mJ3gkbk) E݈?]ct*B7~a#W(ǁ WZVaǰ<f%Դr@1cj*({YzժUGUZZ?QF >l1߯\;t8qׯ]H$.$c!G;vs׮]C$JYs(HanHXhȮU(e38oߍ?mP4 ;tf /KEKwu*++[kC;ug;d慅ēsk~xYE/ `ѢW̞sСӦ ˖-7aÆ6G)&pmGyoY?.  nzi|ɑ1@EVǩ!F+U lWǫvU.VYjk<s8SDjk5X fY+"f - , (E,ʉ%&pN8, B#V( \iE!'RbYHI"RtA)!l;8o"IC˗]PJټo.h|!PטxxOC-JPҀECwexĉ]v2ܹsmS۷{I/3f\(h;.imCZ+%9y*N 9 BtB-Z0` V%X,0&b.BH vڹsSO8ie^Ƹ|'g? jժĘBB=z aq).EmU]Uu#NWD \lIuuu۶,B{Dqk֬YCs ^|3,yÆ srr(YЃ^R: /xȐ!{b+^x ;uoRJ='y=˯u떢/K/BH݅eumгgU8LBea}3_} } zc!30?uꔢqI&ivi@]]u_W^9 8h%UUVveUUV9N>͛7iw$J1'_Uh @ at}. NmaHdF#F(/xQFv_ۃ>.!̳κ[I'OzT3ydR6qrF~ڰa?t-ZxlY0ٻw'g)**wg`ʔ^zɇ~x 'eAόڮ]:ڵDΛC caP<Ԝ{O?v91# ^~{_r~ՕoO?tʮ*ul|Ԧysm<@.U : U&ډ8:H%ԣ$}T:?{FC %`#wwՃAQV(x o_}svayN϶|/V8ܸe#G^;Z̞Ssp_ !6rk2gܹB|wÈSV``ˎE]D)}Gϟ`NgU0w^lΝբOOF+)qZ[WwE2v<ba#2C>_O<Lڽ{#G~ʚA˲0kvhԩ=wOOKyɧg o3⏿f͚w!xjaÆM5 9~A8XgPNvWaa]z?O7_$;nmʫ.**s1 |Gt7aiO3J] ?_1W!/\3abK.y<)SfffqN/g L)m"8z:fʊ pµе^rןp񮞨o;󡙊8cW]y⣇ ۷mߝ|_ZlIB pGy0$3ݻ@~~3ϼ[Çϖ,nႅoƍ??gs[CnW-?9yyͦ릞Ll{/Hola6wصkWQQ~SJg֭0|P!͛qGZJ8(c@CVە0wnV5ٽت;{:vsSJ Ed?ih˦M֡CJFCE ` m> /XpS;!‡RJmysBHmmMnn.%s~PP8F"+|,L@Hii!Cd1\wu;vxdž 9:_D7cƍ;s׬Y`zp ԱNݱc?>x۶ǰ! <}ܧNkZ$9c@RڲU͛6}煅T8YD(N ?WEEEEE^^TVV@~An EGQ柉e9v#(aN`رUK]s=GBChRW hWQQh8vؓO>yA܎xD(kWUW[>=鹓&N:s_x'xR:n8)A7~,֗!X,/7]CoX<IO?oK9910qիW(nsnnn8Ld3:yktcР#  &999 2!999hṫJw_uL ǎ>?0ظU]Ö)Ozn֬`ȑ TƟ3f;SsH$tR2hg[{OyƬYM7KLjbЮ!G=-Nᘅ7n8M4hƽӿp$ڵSL(~BR qoUUU]m]|х0/۶Mi<H$FpCCCC5(ubL5Ά=nh~7"#F&_8,5#rC-gXa$3G#lLH4?2iH$D#FkesFhFX,2GN,eX,Dcx@X,*82X`n:;߼qܧNvgec.`+fϞ}64JŮ^X߾}YlmchNn!CWڴiKy$TJ аlO]NNnA,p Vسg?Ï>%θ[BVuYg=K,!--~u+'|2XR:c}5!LP~xqi~;t`cǍKk/= /x31 IDAT!FǺ ~W^~ڴm;qH^UlB;bX~~ѣo&wq6CA@aß~+Ǐ۫qm޽O1BS{O/]s=kwqk7ߚ9󡩓'ܵ+;;gϞ^K.Io / 40--]i<*QJ'N裏 :֯ P<*kRv&/Y]fC#K(6 $~<(Yk^(<>}<ljE'6#o6?kQ&%\,VX+ﶕO@X% I&Lm<V]0k^n14dzsr\$Ϟ3' τK|rsra+dzu!й!$''7ibR ! a tƌsвћ(բU_P/1⤂est&gvTk b8!׾lpb1P(##c….2dHvv6a7?_c(zp@F1in(tS%CvgZޓ^WZe`Xx1}t'kɃu.q fQYi'kFN1sCV7XUV{aڈ{2 c#_@-CqC.V:B,$ ސ{h.,K D2i2/nZ$*1VIYn6o= aP¹_ԛ^:xeGwׅ٤PcikQ]c+gFc ƙ$RECP~Vzնmt&aǎ2?VBh4 a!=۴m|_8 h(-oi>Þ=zi.===w+1R_ „ #h F trFa#r qO:by~^6mڶ՚P>*c=3+;;=-?߰aBi;u<# HC}"|2T=ذ*ft5K٥"He|~xv[u(N9QW <6$<~ȁG gWyJW[ @QVJ:8333VV?G#zt0ˇ4+;; #Bqj„eåx?’L822_o 4B@HOOΦԎ o԰Ŋh:^6hW9`ZL@#:=de[sjޖ`h]28Q B_3 ςbޚi\f2z.hB*p *n7BSn菩\8uaޓ9yd 2di'd&[8-2l;nuuh%!vPZZ`-?Bl/!uHD""1 .Z7 [,t E&S9999Řɐ~Uu<2̌S;逻T&a\{ W͵0Vw&ȘrȜ5>o)t!|K4J6\qr'Zg wz!{M*6 U=bR x!RIk)F$)ZăGB#i999X4P_qOe{[FCRj&;mV7OOKKo, cߗ_8| Ha$WX(_ x(f'HDr \&Dld g>م=Հ7n!I`+IYkH$g(CqJx&xYK(Ch4n|u\)ƺ ΙA 6c.ͻ!NΗI1(([Xv"GTvL;\7/uV7ŶFѮ;m a. ((c^P9E@QȆC$>~E}bP+W|R%_QigFOv`0B>.3!ePv<.J(:v(P06K&uǏ^x!L5وپfPbdo$׭'LZ\bXZZ9(}q9ZdF77v$ktk,`mt^Σܵ:}=vt".mD;HaܘVcF!dd +>^U m[a2,+PiO`B^BgLBHi$b4uOR  Q\aIqI z0&+v|ŅШ̠z9bL~k e˻Cʯp1.J+CUx:=),ƽ}841lGQ֧i#r쏕cIF%\wMPav"rbE(*KNWeO&4㍸8Q^Bhhmفq9ߞ cŋ{x0JUPXU:&br׽C b1z5LNuaIBލzO!N,_{l:- !%Q€(=@8wiu%"#! nCrA0.z|P%5H:SvJءSqA@ҔTv{Q7:rQLUa",6Z'kSE% 9>_ f;4ry M5!72Sʽ6Ipt@@0#kꠂ`OBpB9#kAq~k/hw7-a2Ŷo  G(uk w4[L*, diYWm^& ^[aWm^N%Hh@#JP #% h(ۤxCIx@MTi4A:R6׽(crHBN92zr*Q2a?Ld>;>]@B~+XB"`_CUP!s~3vr6᰻oxY[,'~K>0i[STCou)}B [^T AوAǤ$?Gt;EJbrІD * FzIiC*4W0 2*2 +;BUH,0Vԃoޟ$tLKSuMEU+Nw@cS+%^>Hu?j$֊=)޳+,JEP}v>}-Θ}oOi:^Lt#2]a.CwK zж: b![9"SsJF>қK ]ȓ'%I( r7¦DF bvkA aDvή;^n.<Vy*FӍ,Y|e6LBbnG(v9]Tg4k啷N䜕-4]-ސ@7Bѫ^k,4:d ˕&)jXdi:妅O'WE~B){UŽ{D8!?ƧNrGaI!Tzhm6Ę5/m(/X{qAf &ȪGY)X*YbFt5 q+CmSZy5QCr;b QJQ[9旴7TN}f Bt#`CzrEQkܗ"$ 0뒚NMKWU_ xD(IJР@^`ĴkY(E[F0"^VafQx FW}yBwq[dF!u+Z@Xuy$>HX}V#F /㐐UqtȪ0UЯbkx}(o \ 2X>p+a#tMa >Aijɲ=SW?QᏝz-ĽKug]e |z@c*'F{2I&ͨؖ# Dh1r]6P{a&tM0Ii(&:$kX-3?btI"Sj ܹsҥ55`<߯6YbYn9ZJP[Iz\pzԑOb4?yA;q qOPYeY*H QɈ81$)-F鸋c*?l{;W-'xJ,'x$#R馦bp'b ںM|ݞb,q'T-xQ7A@bQDXw-w״35tq73pQx:UEUuŋWPP൯0x !{JήݤW]ȕ1a-?=#Ⱦ =nDJOM"u}T ݅PMdKF &yuv2^0|1 ˳LpjxpAB@FQ1d*S >^ly_Yصkvc:(Y_[_~t`>U >'3怘 ]ƶpD:e_#`ep!F|;8V DKjhm+um:7RF@@7NKp;v=>K 8'3Dž^h*ŗWe{q q"Ҥȳeem+<?S^#WTF|=XI X-6)JZlQUU ֽxZ>7Ѻp&~{C=mbJP9źL8R:8`BdҴB%0F|OXL&P8\z @*' |&Qf`26PJ eWl?z0Yub1@MA *JRhnA6c}!{ql+RAHb23322*)Jқ5O LrcC~nQ!̱ yzڊ;ru:B@ZYHU4u{JAᩰ ݁[}5DdDDaM~x|d $D<Ңn쎱SA$X%'RqE[pYNjQsZhJxS/R~iKS(O13g_pXubcPR^3R9_ 鬱ঃ2[" !-Q N9] I*ׄG{_^ !D|AO!T#$ ,,›d=dq:K PUH'RN4 9 AA) ȀMyl#E}WĤ#HPEHOBtDt74eWfTkS1Bc@n11LVaFr?UIQ$\6`$B+qʅJb)kHrڊtp+0)\,R*&Ԝ(M ƔVӕkiECWe9D Ӂ`5AԹx&>#>Q#$O~>%GUոVCS0xRN'iB3U5S (ැԄ᪪*+((:geAqVD-o`阔.(@K `84 NnWcpHs $;nMcRO&<}@PCC^lWXxb@i):@n״)d^{F_&,6],ȢE0q"v^Wl쭲Z u=/Igȟ&_9|w`/TڇߡBU`/!DJy3R8읒*o. :|u3V^|g IDAT r$NDɋ\ES\;H>[| AkhS(LR΁@'O޶}/7Y__χ6ɲN-*qjGQWP{~;/1{g=%}݃}O,׍o#s q~w{80eM{T(644uc=, ڹ=Rb6VFmo&\nóא9J\mڶXoZNL&I\^5y|ChM؞G تţFa?Mlm/bͶ+z_v%)Oȩtɱwh߳E9|^VmEṀz+? .]e@wsfB4?!Pϊ#)-OFkڱ 3 -[-J>o&ر㮻͟?>;;믿Δ D Lơ{%3y`nJsJ⫴5 ~GnR4u <|tto8+Ζ.GvKmr,8 Qsa_~U,S+y<7E:~pf{lv0}B~uhJޡVU}*}geu>qDRX>m :A+7yiI)Mkʔ)Jb]|#Wto]|9[wu+m㏧;cѢEO=vm5'Xʐ?c <$\MRyS-Rn y 1 cB IaBY)M: ַ* ^ ,⃄ <8??Py9<ht_hrpBСC[nsf˪7ǗnQZ_UUS{ /GYxUճf٦ ~Xii~w0i-7nG 8pW/%~ˆ_xӻ7|^]]sgy~g}6&55߯t׮SN߯G}zPvX}=zEDݘY:WK.( W^PZ={4ܷ%3M:2Q9!4^z7vF+3Lgq1GMq_S c17їQ jUXXh,pΪwpBlzzz׮]yx/ $jӜگc#/=OG\p)7=+êk_;aʕ+?W^` x` 7tҥKg̸/w嗿K·,YʮYee 7߸wƽ͇fիJ?7/:4?gWŗ_=zC=sF=`ڵvq\^a$_Ci^^.u?zcvMo.z)P/t5 SHߌR/4v68Yd1ҋvQGQu3dáB S qn_#J|ppQAAA̴*8sl͗V|/;va():8!طPqN()dIF4}d>+dC:Z|ºkANׯOc]A _=b&OѣGZZ#G2!0jh?I)Eɫ WYz1cW^ꫯ:llڼ {Ll e,<4;X,sСXmwqI'㭷Q^^ " m?`6ie k|T"n~hDz/zQRIqymX 0~#8C͚53|d1! X?ù˔pwL{啬͛{Cq'(--.EEsu-!=:,մ-=`jmfL&LK.1~裏^J<}WYQڇ9ih۶ԩS;8S$KC.**z_~Y\T4xؾmz)B–_~hB p0C;d2%T^^FxMpСGeK-\sƟg><Xr<;J]T2 t%Sk0#gO3 =l &s5S #2\5 yF\or/:i(tK?^`͹fe]59h!6 IH.k^1-#DCܮA]]}5Zq k75Be*lq:jz&yA̴<ʒFiZn}AuMY>#=_򦽢z Pn݌IJwh7NZgh~|} /_S^n]i$ώvš5q9s|pGUSLu6h Blؼyp f!F}FŠwcࡇ/J]aߝr <9ɺٳN=@.h$lR8#>cd)OSEIBb(7868#sՈ?zcʘ\臺ʹ.Q #sc| A(rϞ=;8vV̪g}3KmYg͜ҥK !{ݔ,r>Sgӧ;ܡC]w}KK۷o`̘1iaC;v܅6NԗQ,P*pw^}hӦ5W_seMVfG.۱#9a 0Wɾ𞉎4t2jel0NA!}KxT"cVfѵW26&)w!Z (KR =^}w~::{tHξ?Va6a5ktԩ}{I9\9_)W_#n5DK_嵰d|iÆ'|d:!po!YgKBncn4'Lx^#ν=E#m=%5 ijIL*E{N&MiK`{{ȪbK |;,Cxb_wRX5YJV(ct|ŅcV]8:;,?5o%_}P M>y/6e;U(7%T rT+UFϮ\I>5lOԨgiry` rjX=$Sm ˻i`E`0 rPJak³m nA~̖SsS0=s's+/-@0R~o.Y;&&e{4oYs*^ֿ]+P~̣DBpʱW)3/kejp5_-\jP;<'ӛ*#*Z?KS/AdR(//SN}U@-@xa!nsX CCQ5@(8ʑGvxkp կ;-Y[уF:%&,{>Jύ|n:]"zw{'Lsmo@`~:PޓaHѯ+**|ݺu Gi/A, )M,Lh>VSK)?=Gvx*bH nS[ګsZܿi1>X'g%:XM]B#˓CHЇȯ4!c2lF\QL LDW8 544՛>亵OHU@aY a8i0&tAlmu֤M b|򭏖.x);w4̨ _//Vջڅ~Qxa ܾOJycV8nLR[ڗx>XoIUC~ر~ `֭2Ku,VN)847fwgSQZ.E)JQRb}%|%.^S)JQR=L۽ئпV"E)JQRtpbŏ$҄POQRhO @,6E)JQRBʽ$T(E)JJ,6E)JQRB)MQRhP b =doER(E,-.*,.*qJn 5nO׫Wva!ޘ .bg1K/@6m~駕߯*U>hzc")JQ=9UkX,DZhRBȯrmiB>&Ƕt-O@<p8|q]8q޽{,dUUU?} \0f̣>b׬po; z'pA&igW(E):7=O<٫W<aܥʕ+ssrXd:@X۷逸o'gϹ?T&sD.^o񛮿ibOͻZFosGw_yjzf7_~~~ɫ4hBh4K.ۿg6TЀY3g^?v޺kРΝ:rɴzs}kO'%ٳ{nӦM+,,\Sǎ[CU>E+ ٺe˄ zm/~; vr7777&&=:r1QȢ"\4OysN'NΧ:V۰aCQQv#GIII=?8tp\\ܚի9 (… <Րqӎ3E{oݻ3֬gP(444==~oڴrab>bk׮a…7VqD{{/0 .Y2_rr$`qb6n끼=g fE&=LbHo>8jeΝKD?yּ&22 } -|qM>>>k|_h+ <##=99 i|jj!!\򂂂vvvݿRΦ "bFqS+Y[boQ&EWs Xl]v ئ$,,_j}nslڴ顱csrr/XR8{|ᆍ-]gΜ? RNaַHr#̙Q IDATh"̴ϝ;_4hZt}uLI)vϙ{gU0&+:[\Gi;qXi?"$$H$;w.ߢu$JWZjj|rkiYG/7L2Bgfez{Frj\\\jMl̬L,2Yt^Mz,L,6Z3^F٨EjW}3gwHQ#G^295kzؔ)Wtrq'>]n)GgQ4K$ns9Sn(ּW_?N:>la78i?tRIsb-7'l+lY_NDY/ `D$ Ntp.1]\H;ޒcY1%g/-Rsb(^#8? 6u'PoA$_r%:*ػvO4#J\,4QL^Q'ڧ WFEi Spoksh͌GaT>3g*ܼO~WO dgϜo>'Њ]yM*q7vSe%7NKŌIbO)۷k15 \J9wаP?sC{K%usd`9L北8.\#k"@sQ*""D zcUjpК 8o9._4J\5˚lvKjƘ_D"F#ɂ+jJRV+;];IWHMYd瓫ӏ?X˗nɎ "teM)8/Ǹz;a8~3{ٔ{ڃ@S,n%r_íSX͒*m.H?…wҥOM܂qqqYc \p@-;O{+,a)"Q-~Q޲Q̙j\t=ؔm[9Ϊ1 -b^{+ݻ]G񁩼mT8VaϷ'ڱc;K9,m{]9eYS¤RX,nK]iǛź" " s޼QeVl6q ôҒL&64^,b1awh4OdZjI(GERlfkf,[QQѭ{ezqZrQE;˵&xEE>y?3m^v""!M7yLߢ6ph3#X5qrԩS/&ZJ*$4,/7ߕU aDDD+&xb rBF9_f3Hemeeeݻ0 kV^jFㅹb2i/] ;nԫVUIo"9dPQ&7ִ-lFlyȎ$o=ڈh8+hr\W}X"#"Q΍/7Khьb143ٓY;vxb%<[]QKGBBB```K6g\lzb6cF֑+6 md6*tV#"2YJ鍻V٪իZk_||͚Ws^xQRc?z/\^WxxJ9kӧofwD"fH$"ڵ#ڵ+((kCB?իWΝ{Y\R5_+**.*.G#}{mw#Æ orySqƩF7gddoߞGl"]evLD7*{fI^^^tt4?c/ϷϷ  "L8mZ~.)J{ doތVMOKlؗVYYAAA7s⋃ R:o߾q_ h|}>1m^ze2'#l$+˝ ?oLV)-*JYsS5w^,BBB222iiZܷfBFr+5=##9y1G5k^-*.**.Zzȑ#k0L2Bgfe.[>O>Ӈ~/I H_}1c2:aoz;eFWi0[T2ٵ%`WM$=K ,^l/p%,^hC5Gi2GN|]t2yr=Lܽ[3gP[{|`!CfϞ]ەɯYӻWǦLwoo`Xm+O:ڵ5ڗ&]/\974~:uAAڳtAAKl&+_:-ZzVgΚ?K,}Fxf խkVM&>UPD4l'={d%mwGMzΝ?liM.bOKMWXaі?L{oW@%nX29(r oͫP˗7h"{>T={Ç '4hBh4K.ۿGJ4$jXR9-#}菫:~ƟF!]Gmiޮz٧_>;BCBC]9pu:_ǎ͙;? Ǐ9p yȑDGi"pk7xNQ9y6ʍ쾔m_8Hh&OA{Ζq]RXP(whݻ_Ϟ=wѩS'\NDӦM}啕C hkqDzŵ{T*h=mjbU:yƋu.keYY)eLSD޶uDhVO̟7oͫk"#.^w 6W<`%uU8k4 B!HONNvo|୬Vl  "i%%%9e2D}D.?ɻ?i@ÅD4tZużQ_,9/7ٺʉx۶)v96mzh؜+Gs6|ŋ'Qbb⊗^6|8?kM˖.}k3g/"xe+*t{`YVy:WjMgϜU7uJzʌ!5zeႏ,rΘfۓT)5RJwm[Gu7<+O$͝;wܹ5m߾fn~'OoO𔗗GcY`߼׳ZJ*4,,7线Zw{[3^~u𼃗pf+++#`ο&LR}5Ҋl5p6h2[,6IlDfh4q6b=Ө X{9MNN>thJHHx' uź/wK48"]$|V@ޞ33란@d $ܴwϙ;>bĉ;w'ER,y#ZuqqB*XmJ)?FZJ&2[mr'=qm=w,z[Bĕg@eڎ]v EUlN]sw~ԩܹsz-L29ŋoD"YvwAD׮][jՑ#GVn{ׂ;u .4PSǎ|o6Q\nb+_, VY.@?Q9S<{\fh/!h ڷ tWv&u_kN2%**Ƭ_o?o?ƍ;/~5kvMDIII˖/߰ql޴iӚիvmjUOWΝ: ڻML$1Dߞ*6YWB $]l5Yt&@X'#f{㦍tAw ZB垝5KP3zɒ%3g_z%~~-_M.=7!?ŗoz8j8L)V"bf 54U8Hts'jCBWQqQΝ;͛G9"T8mV>uJ9b0aiEnaG ~Q]V{tdbfzhJߜ3N~ S14^бL? .s`#?{Ykz9/AjN۷/qb7w޲eKCCBV:o1oHbX>+3V6N.Xٔ>vѸ*f|QBDCD%(_]pSuV#"Fsո8g b?:^a0~>s+MW3VKDoQ72//e_I~9KDYnLCe hi6ֹ:w'6:uJ.wݺNbW&'f͜١!Sw}_}劗Vϝ;Wg5"G~Xן;wΉmA+`lU-[d唚mQN)KTYoDD WUm֜8xpbrWaÆf/8iR T#Nr1B8ǎbjO`Sf%P^^g*P Fq6Aě6D)f|4&/7a*掷E˝u)Z{K'nl:PHDSow|]+ʫFHu,ŊE+/GGG[o6{׮],OIIibp!J/_\TFDDNCVWٗZ0"X$00CK)`0,k2fsyy<م IDAT^8d2^oj r6A)OBx[k6m6˲6GX,6jQW{oXXBBgV;>d2QRkpi14Rlc3_IbgT}}:F72& l BH, ~lm/ DtQt1TrJpyB;t:^rrr\ru\ϥ3m/,g?~-n@ЊU(DdE"H$J ercl1~_(+"2ɝa"N ah@ЊdjZRjV#DeCC 1q8E'q|+juh0-du@څDtnODB_!t[,efj5d2YV`ZG'Z,Ʈ"@TO<@㜪ւ7ZVjXDk4- bfscW;`72` ȹ4UЊt5l-6q8 :y'=zݴ@sIh:E 8iuqΜ R+N9S{~OPէX"Jf=KD{|o/ܾm68(4Dۭkm;8x ?㸭[7">>#F 4"-P*IIOћoB_>/fE1 0 10d/_8]5C5?9hT*UnpR,qlX,faF0if'Zk8{0Cd0\pLhE 0"H0d0D"~j,˿3"aD"#D"]EgFT\!Vl%!zN+((*fh4ߋP*ZÔ*JXpR!"rǙf0 qeeeE&jZ/_$L7ybuBKi8LFD1۷d$ڵ_E"$JD6իDQsJ=6L&HD0D&D": .gF&=kbž={oΝS||bNp'U06MRw8MbRT(UN|sax___v0+w;s 9U]HrI14ϑEFErFt.YXòX,9߹sgoOWpo&h8"TB+c.3P_J%a9kT]? BPbƁX,ڵE)V ׊N[z aも2` {+V$RT*ƕr\.s^bh.BHj}Vzs8G$ UXH$d2Cފ9!널bbVrA:s`x-T*eF"ػWu>dXh.BHD$Cc{'ٶ+3;5fF/ME"\'dYhID$Jb cud5VkAAAaa!˲5ZH:XjDxxT!}}DZf8d2 JYىz R m_@Ԉ~1~]Ysf9Tg8nVT8X02<*::𘾝A;>JJJD"c5L_\.Jh턖by| ҥiaP_ҮO?P\\l4z=3\.yyXxM#[:a__p՗rBrF3{ &J,Z)n@ Za넭VkEEb /I৸m4NuUݻT*Oo nBKQ,jb2hNmj_?wGDDtXܥKZ2 Dt# $<t}l7gl"Tb7mܸ*y1^MK5zUɛ6mrĉiovjj9sȡ)_PhNzcǎm߱߹sg ojR,{86L]!gfP(3f$zq 1[sEED"a&??ݵ Ժ D}9jX!`"jDtuEÉTO[\hD"d2cttt4 ?+..bsܷ*&h-8wpbbYY)K%teTN0Pߕڎ0RO 0j0;cYщ>TwZEVU'GQ`+XR]ahg$fzk^"Ӂ@TO}T5Z{6]8~V?ޢ>2uRʯhNy߶m>Νa}g϶{/I[o ZʞbYsIO^Cf.938( zZdee|ذ^ԋ6O-+*{.?D=VvU؄Oo nz"ZnULZZ?p˂}~yy?qw?r7oHKSqVbYOlpZY?D6v,YjΟ?+H リ={e٢'O򜜜 LÆ-/]x͜J8X矷[Ҷ};X, eee2,##"//CEEE>>>|+WdggbyVk۾=lJ{zN+9s|# t:]``jɓ:k׮VKDXl1`qqjK8)ôi6UΝ;guѱfnn.˲DԡC:ԷȩS ,pRlIIInn^/***--:thXXX5DwrR@s.6**8֯_蟓CD\ Cǎ;w\\\RD"hyi*;,h xk׈eYsJ^qSN1 3h {eOh t|J@bu:ݭZRRrɎ;ub̙3Zmqq [UHH_|qw9j,XR-Jd2YtD"QnȐ!HdI,fddD"{pdVVVmRlRt":{VXBH97͵X,CԩDsp"#FQzz| r| Do߾+ߵ"zf B1cL"wY|1=lR9{R,3#Ѹq㨪.<]tRiG޾cGVkY}66Qaa!56`q7vCk؇8^eY"h4&)9ye}ƍOD[l1L[6o&ɓ8ڶuhܴicsmXks^bÏ<_|g ݶ}E GUg^O?d-aaa .3w.?kw܁ NjM)~Q2bĽ}kֳ qg-R&L0aOG:)-b)-b)-b)-b)-w6 7 MHݾ}'2"xX^v^n0"$yWmRl :sLaAAff׷ Z t sS/Qe C)633߶,.*"b[w\H[B/G K).+7vk]hm(:nMe$OӆvlU,*>.ajC-]},XnDh @m['i< JJŸ M)O5#-I: ВՊrb3}͸6hkbo߾yy9~ͻZh#b  R,[ R,[xuiZ wޱfO~~O\Zb>D"Ru̞3߿tӼ{hb?_8^ox~AaGޯn/--o-Z7߳'((z7S#q* R,\+O?jZ"~c,V?ԷȰaCCC?:9+_[TurDuɴef"9}Rܹsg AAA/b6mɯرc / T(XuG($ervn )gE"\*6`0y:FXR)*t:`ZU*L&t pMIr\J-b)-bܢ);q0 q"K!∈#8%#r֍ gp pU2|QGbj0_!W?}c.9,p5j{$7W*jkTjU{ qލX!|.\^mU9|6jC,pT8n,]F՗TadILծacC_92Ab*f _"a: Vծ\G?VsLo2U_5aan+lڒ0]e7}zWUaʠ+*Vc ϯ =z_:FMrξ_6baƿqW,5o[qjFpuk (YuEYkYM f1.r?+}jӱf>VV׺j,_Aͭfsi>T~ bxֶ^GkUzԊG_zU/n8T9CMjJ%$_̳|v]v1G) Bf](Q]-)+)a0? nEU Mt,Z")+nX:G ф.uJeTT*F< |v-#.ðV [@E4CĻ!|~{k] 8"tb{)T*m~>(J9}bk&zC0.Ap8nݬKK[-.555@@h4=P a8^vH6QoAp8?CE:8{UTuRi#>|Rv~RbI^3h*y 6>yf/H{Ahܹ"Ѫ7:ܺ'O6!x ӾuThXXY2 `eXGݵ{*RK_px&:$ZލOI*<C kǗWtGunjcYiiff憍Tt:Ӯ啓m?qP~lۗZ+WFmJLy3kE;vRueK7%&yzztue'Nq0~r|qM ɾ-x{^v˞_1jpT YrK"8X >m߶]AۜaÇ b.(,TwPӑCm,R)1 ׊ˤpę8z 3ˌ˖mNJd]~A ,).5sb1iwtp7==(0u99d'QU4᠘pߑnا:qDm]YS[{ĉYf=J^ijju۶Դ=n˵wȍ̐hMC %>>~ѐZ3;xTS3bTH3i qG 636VWܻ鸅5yt-u8z۷ mCn2ڨ *%P^[1n#BQ (Ǭ "HZ!75Q~Ax:?afZrY,ssX'|7F]Ys&&myfJJݻSS5rٲ:tp֝;-D38Ӂ)]F'Ttq@@7&kyy1LU,pi~wԩ/Zt*QQQBPu ~Infj}I1cRRRRD;v,&&%'ڎEoRJ _g+ r1PX"3>BPV]&]kZz C?* Lr\ <#NM%+WP˾J$ӧO";dݺuqq~DCjrM]]]̂7;x^^YZi`CmM@4jkk՝-&&&~m5ձH y,L/QچJvݡf'GG'GǠ{wnܸ|i[r[.NͣG z#ʞ0lXbbDR h@BJ\UUL޶l3-PJThR@:P@ُ d]i&nXV<82zpʴSLtҥLجJYi)̌\733SKKJLMM>ǟ|>999yyy 2sssҶ#ѾP:"ѣ?2a„QqI .ZDHbHTF_RrQL(0ͤ{wyW;7[#VzyR*M ݬ0ϴiӓ''6m1Ĥ#F#G]5 ֵ8R-6[=Fjp_E4᠞VsZXp]1)dqreC[W/f?<111U\~ڵh[F2jӲ:3^nF>t^emg:S {n&GOvMÔ޽{MMW^EVגGGۢ_qxNNLurUDi z̘ɻ/4y>:_~m֪,E%NU:r 8\\p^ZMg3F,e1baŏՖ5k~nO?$~>aჂ MϟOFF bii`i/W( E_gNE.Lƕ3[DKvR;66.~~~kx{ _ظYf]rMlhem 2ں1{>ޔwiZ&ܹ>{O81 %M6&"⥱""32F̂\wEy@wDaʀaHC]5Z@0&WO(ڳsSq_k"%%tw0}5©q%_/_ކ R zL5W/G˃=w]c?^lK3)Kb\D)G1nIʅ>.o7ݚ}tq6vvhԻ8.VueҺȤ)$y ^XVS)a!Fo5 @Y5^Zɕc-,999k5 Rh4 N$QEa*%XSaae{pJWX٥zG4x!hGhڮ*v3:tkwn:DMj+ !{DDϠc2sKD\S8Bv:2{h\;fff<\!^[҆&CҘʕ{4=~3뱰qf]C;wWi.Hі/o?.AsOh4`0FqϛR P a8!CB݌zOĠIgoa}CcNKJJ*v%9fݻwr[H3m:9·*! ǻ!Qi^.SJ^^^YYY__,,,XYx [@E4xw;$J7- q1G'i4TpP IhvHnZ@hcN~VƻNIxgwv:]Y@4"a@ A@S,@ M@4"a@ A@S,@ M@4"OR)X@ T*{\)Vz!xzy1pnc`7@ R)ͦjy EO!oR鵂uyb6=]9 }@ Bά# \&_ͼ񤁃 :B *8X)?]! x/SHx711'z7 sUXIENDB`knc105/doc/cs/asetting-cs.png0000755000175000017500000017557011436654001014270 0ustar dandanPNG  IHDRv pHYs&cu"tEXtDescriptionT?da okna: knutclientPX tEXtNzevNastaven UPS ? KNutClient05 IDATx]wE޾e(Q *J0"D$ޝwޙ3 @AsFmZD  дSoC+2GŔ҆*SY#Cg-,L)a#<3I~as!b8:d2ޑ֠T#Mu9M@&]{ks־ynvn~Ɖt F/$gU]՚n+ 4w>QJ9HAp /z:%Ll@#>rH/Ļ].FLb]a;2ӟ.h(vPZ tUBԨ` lXUY.3J))3RBz*JQ#(w4[kQUS#(dzNqxp$'F {ywJ'ir` <y5d nCY-ZCٶ1Z_[`vn~黎& Wq#3h !eʊX,_ nHi1"%;Pa*T%c(ESНxBI8T]0 Q_/VzEsBZTGk%-G3cCsKaJ195ܙ\QYE),íUI)`bCtrCaz),5LWZL:W1S} 8]uYb5%rx<^Q?9BZjeYʊX4be3!- LHeE4aHaY5bVF:9r|%Ge%ʊX<ѣGA fM5|ZqA+plVՔFcm۷_UUUmm]Fy[H$>!b,O+kΣX!ZzqQ S JaQΣ)KS"z|A]Qh(X0ũ*#RWrw%MD73N@C M--Y$(UQex"a_{e}4!iB)PjzEʸ!`6E"g2? lTSbۀ۝ Ķ%2cNH> @h4ݷۿRܼZgefڶ |y #(ٲh49y$$77eVLNxY@$R-Z !rHgT][Eo߾[y(h69h_wWD4k>**kYeYvoPQQQ]]m6!$Q윜;tҥyx ^D&((AhB(ljf$6B]DY΀S S< mXxmy^dp/ZRٶ`NI+aE1F㘦 @17bv "tSiTx)E^\t !FLdv!Y1.@]PmA;d|a(I+++]fڵex\ 0pJq]h"H3YR?ڵyL3A1v΢J/ ~([W^tҥyx8v%#Akx XIou?ܺ*D ۾/[IQ-/((//ߵsڵk?p|;xbyG{XS" XJ}xE5/ h} tWm ,_dWrY*Em[ՀY~D doB)slEC=N !Zt׫a< ->y ;l(L 8`b`% -1V+4T0RO*aäȽꚚu{:JxW(L Cdi+9<oYַne?l"|_Y#s:ىoJ@ ݷ[?|Aawڹ С!-|!EAArEHJ?UpJ!m[;wJD!BC@B[ăN?])LxE;@B`eeŲemذ3G[7m3s&RL"V@jz4*;1T3>RWw9xĉV F 'ևxʣOTJ pm|NqD ׾][ؼy ]6yVNVpvP}h%lgP*O\`-h3  E {LXMLeټbv|;0+I|W?T՗GW֭[?lذD"6lРWWkDmG\>r˖M6nF#B2:ym۶#.b˖M6}Eb! RlM4+X]R˲СC{VEڶM[1k\ve?TzŐXl"e (/߿rŊk׾CXE N<5k:cCYxڵK;p ^:;-`j)Ly^vͣ>PX^Rq/_6k9sO+)_~ 8HUնq>1Av>lh,5kv޽~#?,u yi|ɑ1@wݎS]$*uve]^MTDZ{_M6QQgWE-\7xE!q.(Љ$k `Xeˮ%L`P\P'+'NmSDZr90wxqk\XI'l4p]" rvzJ J a!L2RxuA@FĽpĻwT'4o 1FDE +Wءc_뉓&z zG[o-.**լYsc" BU-^+x,/ʊ]v |-EԷO5_l*Ehh3nݺ=#%%]qgyfƌe8nΦ.|߿~zJi޽GݻwcŚ5k b!7xc,4hPvPJ+++O;TxwɒƹO?/k‚.!kBC˲ڵk?ҷo_ڵ |:_&OPh̘3g'@=Bݺ=Æj(+֛oN:ש|=f=AAǎo62ա};ظi3M !3g>gϞ{)B:w̙3E""ty.\s玢+Fڱ@iXQ˲;N>dQަͱuը"/ (SBK4v?F膓$hR8ʯ 4s՟+ɥӔWTAK -RO!r#" 'Turz&L%6 ?5lqzyyPSS3ie{ľ'rUeEժ5~b&`YO$ﷷl 7$JNdN"Ъ biB{=>cL?ABZjD>|%[Ŗ)Ӽy &zAjW_u9s n(Ϸ [-[:@mެxl"\-Z@eeE8n8'!`S.#lcx&d℉׎%KN4H1V޽/]v-9yǝnqϞ=f߿5_Λ7k֬SiiK^n߾k?)y]%%%/^N:/Y$ <8/7oaÆr˭=q+JH ?I'O#1|>ǽfn8t 8W%%4iG`g}ڽ{-,,0eԫjgyPFh77u6m,Zwd@VM? ϝ~]x_oc9̘ _rɭ\7t{キe elVU:6jӼLKnq~Z۪eW_NI8H%ԣ$}Tڌ?o{FM KqσEg#v(RAYa W+tB>"<7m(|'O=عE,- '8'a'v|!CO/|9s|oQQN}EӦ4`Y.RpMΙ 8uy22 Y 6"*ѣGSJgϞg-]tԩ7%❾s۾}{h qX,++ lJDrZ[ƍm;ǰɰч֧S;w ^]] -*++ݻ#hNڥspZڐC`{\\,ſvu#Ggdd 8oߦY 5ɡ|"; +O:A//ZIP; _rmcWXX=S;{,MXC-Rþ}+옫%e…  5ʫ`SL83`۶`_tV!~g L)m"8L%UX@%5 &^$N^}UϰS󴄇ΎHfpxlrL,+!^ib۶m?`(8ql'ضݬy_쇞|rms3wɓHBq*Haۢ)S,PBdU5/s,QNwҥ 71%aԛh u-g$EjB! O>T()biiH=V-@)?g-b 5!ԅEB!WVVzih?bn"B!y(ۦ?ϖ.[l)^zÄhԱR[JK۹cG~WPZ, tL1+HZ( x≥˖?|'G%JszQ!v ذ߇RJm;/?R]]zɜ_0h fge0R\ܫ"e ӦMۻwC=ԿD"ѧOo݌9K.ٰaҥ=wqg@;mԽ{>mw^ ̛?;nFC Ҧ͚}}PPP@E䟏4rs߿ƍ@yy9*_Ωȣuނ`}z3lKTmq4+d4qg :nһO:{, ߽{7ϩ%%//Z_0|8ߣ2;!͚7߾mg--**ra&eP%판5BXML%^ݏ%rĸ#S7kQl|o&"H%-awŎօ^Zҳرys9֮R:c=wkBm,.^bEq^/2 IDATm۴aW~KN;5}%tgC5wӍ75}^xyh٪ĉG*bSy}sss~Ms'g8tQ 4'^{mVYY^1o?:`Mмy㕙3:yeeeu ٸ_yU… O}ƌ? <*QJ'N4{زe8W#l xV-U!(pCce mO^̆zV*Dfqdqx܏'V|ErZa[W>1)##+JR/0PXtly xD(7K"vsLBZ8xy52Yuuu^:uǟ;.7~!`w-/D`(ԨQ˖-_YYYeuuu?_~ tУφʧ6Msxs@$[XewJv *jŋ齣<T \OsOn١q@MaTp3ie-WDh;Rwʀ5F0&#Cq H!HHpsY,ZoD%r}#Bc|sA XP|Ye"oR $/% q]dP:uG6U$FVR 8#B)u똊3 __&iCy/;FE `^Ub/D`0N/[te 3Za`# ˖.KRH<Cg!$Q:?++܍|Ge)۝t(HKBFf=.sL,Ű%x>|nzX %,6b=]tmպu8-qDu{}Nء}iAFl#|$x#"3VD$QUPQ(?7rVJ%6Qa6*` (kyr"zJA"z4bNP2Ȓ6(}Bw(@@4h8b-rLAԟYЏ~r(Ї{Ay ~QfzJൖ];fREMbQ}=:K^48#c5\-wݨ;ax<JzouڭUVpɫۻJł!,kVa*Dv?bVZxq.][nG"޽{+—0!Z#3ECi!EYeBXźӦeVZ ~hPy~ffeJJ?[7 ;3+6-ֶ]ۓN:9///*B'CŮك NŌqIB5|x]e]n*a,2SNB8 I-y!r rwΑQ3+i eJV41Ru3C("\a)3KSOdF,79yGJv&:0!b&dX>n.\Dpu+ I[Ib]EQp8CE/GaB0ŢƇ/~ ^B)C6T(t4Rإf6o8m8/b QQ6!l1x#Dĩ(wBo^ꆭnrmC]W'w:\PJQǼds UuH|P}bP-W|R%_Qi6Ό˕.cu`}"B]fBp@DBP3>.'vE8bQJC`<uUx_EX,BP,.׉h-u("fYB#8/(v}sW(TWؗTziiiJV#ΰ=33 Sc!*O$@N'RԌ9$]\RnUNg (Ia]dZIQ~noym i.$|}[Vx9}qad5*3D-?BBP@<_6Eif<~ &Ÿז7>Cɖk~꫟6p2.Xw@/aTŊqW/ 4K](BQ r:*k^әo7Vuqg>S4ֶ(:P&9z3(^T~T(!"14/|+)|=4t ӏZG)c:S$z!FE{'/[AA6sɖWDucm€(=p~E[ >5uKE/GB܊h`\ /Ss> C2pN+aM9LSRUmEA_}P1UIpb| hLuV'֒/v #+?/n@A187ՄW*(DW!3R,77l~|[ (Y,K ZaKsZmb],- $ tFdVUlIsUSqqe 7P0FRyh Ie@@4pmRxjU$~QcZA )me^Ew1 zc9n$!@=9́Q20|8w|zYį` }UAQ<ٌenp #I/¼~JMinRq׵JtU ly%R)f#I =0c\)zgT>5%JPT4(HsM 5F=Lu od]z*u$W+^XsSwyEG[DWTڦ֥:ȉXHz?AcS+%^>Hu?$֊5)>+,JEPཏVm-Θ}oOi8^Lt#2]a.CsK zЖ: b![ֿ#SuJF:ҫK j]ȃ%I( r¦DF dvkA[ªU9\x ]cRȪM7d]>▍0H# e 5!Qt]vbPvXX(|t0eݕ&l) RntʼwFg pNz$%P р,MGb4QuIU_/=zm"ؐ!?ֆNrGaI!Tzhȭlǘ̀ꭀskqhA3hqȪGZY)X*YbF#t5 q3CuSZyUQ]rb ^JQk9◴TNg Bt#`CzrEQkܖEI|B-a%8P[ ZCIR=* FL 8:ѽ6R4/#roEk6l`0:]fu}U굆 ƽ֭s#bi`9^#m!d2X|3x癏X&ފ nBLЅ+7yL+QE!"n7X+x%rԭ}aQ7x?MJ(d[$Lhsѹ6m+! fk%8 c*SݥA8JQV 0 P*yuӭseC[ DV2JE>jڶcZ ^J~,GYE+pKNYx@Tj"QeIJw^Kn܀/rQ $**Hma^86 }ɻ%GƏqȨa5,JR ]͙bXqf+x[P 4 |k"fT`Ոu=Vf/RzU3 ҃ex|V'\J]U/&U5ude 䩯 ;uSZ>ӖkJCf@;Jާ!0@ A!\ƅ -`uT~N{Pq--\^m^Sw\ްꃔ'a5bR Y{珬 Y\!V!M}VrwA4SnV_> eSnz45dN_QᏝz-=%32>u=18IjIEy$fTlK Z4p9E.ORk(SQ,m{b&tL0I(&:$kX-=?wI"S:\ Me,,E]JP]IZ\pzԑOKq EVV'B\BTVnY zE}2")} WIm˛Q:oO>x9uկu0 CƑCm/ n0HKt$ܺ(&4I4x$n_r>#`I?*1k } {XQ߿ʕMmiupktG3 <>of@t|+V+//k]apABh]#I@v=#WƄUN @: z w#Rzn룥]辿5^%Id`SQJl'#+nç=0qy NT/WR./Ŧg!P,/Q_(gI)U/6yYM6iSO=:(Y7oܫW/H:c0*ܓs@LFɮA]c]UzAQ"Nq4\($_ђZ:&rw]ÍQ<(ͦ\]1C ɌqJ28ݸEQuiP22P _pY)^=g4UF|=ZI"mR 5mڤ{>WѺp&~C=mbJP9zb́L8R:8w`BdҴB%0F|',&hsP8Xz @*' |$Qf`26PJ 4ósПK=C:1E] zJ |%LnA6c4}!{l+RQH b3325jt(TIQNOw L]dž޲D#0*i+nui8h"%w;Saq-@j(1f |uɈÚDȐ.RK8 Hy;N`關RJAmzӃKRe9E9h*mfEJ , M}yP9êͅLLgG7%Obg/i /E[IPʞ~Mxp!TTKQL5Bb*I֓M&[Ut2+eG\ RX=1 ؔcMq$ W6O7t ʾiIҔぎU&J_,נ] iL@[L b:1UܧNUR$ 00t1X& Jr OU)TN[n% fRU\ W$TG1l"kn3E܁-qPt9ϯmѸ,n:&{. .Oi A9g j8G]b ~TVk5?4È'J0hwu؞($ p ju&Phv `5 6LAuuu~/|gk׮]bBu֭76m '@ȶ  Ľ#֒^&QCw1z7E['̕Kڢ6N@/]8[jhmYmNC α9F٧UGS,Fi* ȀPbEdP1RZL<',x:i۶TF:O&GgYX +VY&N;D }TfrWB]ϩdY/qW"D|=,K#"!wu~v$K$>y3R8쓒3g|p" IDATg/|ɓ`ca|kf\y r$ND'O | "@FZVјzQ2I9GUTT XH$o Xqx<==bX8NKK۽{wAAA۶mzӦͭ[<(XEʑF^ziLIFJ]0#W=1|\tWlEeY5o6}ѵݻ]\:tٳ"zt֣{`Cɫuޭ{nN g}G{guڶoZoN &M5kVTTH$ڷo_SSحD"Ѳe˜۶CG'Ğvi ,ضm7z͔P޺?4Ϩ** {JD@Ds!+?DnT< u_aN!jF[&wq'o=%F%E D4l4y$E 8p;W޼wH!O#ʓ_GS6)iW25_l;oņ͵+CP Vvv"*ZZy4:M[RRҢE ;y@,{Kh֔4ά8b'%^0?psn]>#z. =e痔 :ujvv6,_l̙6l{Qc91TRxgƄ啔 v X3h׮K@eUӀo`_xa׮첫m?طŲg(]6mZVV(o> Y{fn!++˵*ض=E/}Ϟ=EEE_|ɘ1cNf,;_{պ:ʗ_a͛7%Vy38]v^~*++KJNb[333۶_M6ϫLW^ygݼys^^q."l(֩?O}Um60JOO?s?+yf7pCVVRKNm ~_ܵkgAAo.쪫l5=b]#ԋ^0ŭhBQR]%}T|2T_=h&۶+K["E.vvQߏ{!P[7si׮PH::bpǎy,Ңq;H̦8W۞' jO?tMnc[+V^Kh_}Ւ%K$RZZZ /~tل _~yь{f0wW1?kyUVkbYi/})򏗧Ϙ_RRaJn,+)){'oz'ÆO/xÇ{oӦMr9B%ee/e˖O8͘1s>O?ҀB牬@@'̳:O>Y7~^~i~uQw,bgyfIEQ_{ N? &瞻?7kͷZ6Q6|-7mt뭷JEFl\z/؜ǜH/bgLǵ$B)}g>OK{RIj䕟9CEǴ\)9:ծa~2o4KXt] -AO®]ٳ}֭kl#3)踋_4#3F |8q[~{{lعjqtB,PQvzUIN~r}O/egJvUf7GºkA[Nիc>/I'w9-:gMA W>=b&OҥKZZC0!0lp׿E)}7Eɋ/vlz8|ň+^[s]ߨQ`ۥBe]t BC s?!33s &'Oҵkp8|K^FѣE^b(=}cZ@K/FNK=j4,zԶYo~啣gc tL΂ TAx׏hԨoߦ+G_)tEm=23Y{\b9,L('!(mc4E.w$1TYFBVф話;D&뫯Ӧe\Ys뭱n׵ke۳s;7߰kxyΪ#?WrKʕi_}u8:7>U5@-ަopc4^ժ0爝.3c7aw_|_)߿1\9ihժԩSO?tQ$KȀ _^;?.*,ׯ?ٽ=B;M4P0<];!/>5k:~QQ푊Z {aw[BaUQZ(*,|^;#n@ Э[kΞ={ƍEL{.h٢>M64S}JKK}NdI5LRQƅ$s^i7.T.dpM}(eeڿd ^"#GZyyU۶&\ 񚚚͛7B`#3f-\E8WM%H#̘HMk~W.aǡ&JVlaM#v?Z^zGŅ7xciiٳH$N<8bĈ /pƍK-}p̻C,֍B(']wF Ҧ͚}}.)((0Av;oaoiwJ? RJY-s>4 v]VVVTTo>EEEvڷo_AA@/6"־} @yywy3Wƛn|0p Afw|ߺUkE$VE\0=CmOzzrO\0L$ ۶,K# C&P8QJt└M`(K& h PM[ХK0X(jٲmlEEEeiӆbYV8=df&&LضdI0qv/ڍN:ˉevo[ژ"#pRmsY0knUY͛-;i?$|6lX˙ʊD"f=oM2oԩӉ}OP(Ě`|vB(J { 6ls;Zf&lV-[{K>#\5r?ޘ2&BUuZQ227SE6mݾ}ժUV*,,lٲe֭EhMjժe˖M4Yvʕ+WYSۤI\y3k:뵮wmW_… w2vue?sucW_{Uep1Ǹ9|='++ēN.g{卻n6{唓>~/Zb+G}9̸ǫu#y5Ub #ջ Sn_-NM$9CDk~5`@˲233C^q]t۶+**0zٲ%#ڧtWsoyf*YF}/ԧߎj"Yhmd7?/l\}R_z8]/b9-ӷخZȕ1T0ZtWŮQ|_r۸qgee͝;uV2VZZz]wYuE{jг?TT9ٸx0D5jr)6I}``Bx;vq1eǠ D5MfI gSO4]Q x< ^_/YYOímD(hΩx%[WGͅ*4c~W6)UWڽkw&Mq_oSx<~z}O $g2DЛx >M-[FpUrΧzJeNdnHD"`upFņ6vm&zC]n**jzm/>qBK;>níQBF:%[T؟s#3BqkȐ!웸F2>آ+ VZ%xI#S-G~ʘd׳yo^{ ^z2 )::n(XJP 9qWDc5WƗ^wRG 䬢DKݻUhDYcy2{R)a3+PȄ o &h&S+_UVV@$IAl)7]M z_Y4غU5Fc6m}k zms>Z(#4# ֧Qh(+ɘxIK2'^؉yIkN^FҕCJG+orܾm%XyyEhi=~O:3V*"՛G* M[csxgO^^(0r[ޤXA!EpݹseYՅHYf@)ݵk 6֖D5e sUˤUdP=cٟV.}ww_):XԠs>Vy@L&:`5pzsVSBbwﮪb w~嗟xoZi&#c?Za hbo5YH ,Jkc'l({u)7앙{nT"F8|`(E! V$O  3y{*~ I̾43v vT4Bm;m޲o^QXSxE 9c"ZbgD.*E)SٻuVEkmYҊ_YG;EC0#KĢvNz(??7QfcnS(Ep-Zlq9~λoWںHM,ڴ:㗍w(E)JQRhbofߜ x_SdnhUY1='4E)JQRtі9YPp_guZPܶ+3{*8; )JQR,+Nuy4~vc,kae˼ (E)JQ~::!v㦍ͳ]ůW|fwUe*?v)JQR_ӏӏqg \(NQRd:b ޽)JQRX+~|(y3Or(E)JQLP*MQR萐rd/Q7E)JQRtR*MQRP bS(E):$CB")JQRFG > G <5n:o:E)JQRtБꉕ+W:íȁ>*(E)JQ3YY,={3c֜+*,hڤ[.SLdѯ9֭Zjy; W%Յhl`I c(//o٢yJ)>H>}Z4ogzP|閉e6)пG}dl1E)JQR #boVz7[{yw۶… nvs>MSN}`oiL\uYk?{5N] Pb1шA jPKb$jMlh^{EW",K]Xg;sf9;3&'''ɓ'U*ՠAllllټxݻ=zd\P򨨭[C4=ܻwoٵ jpcۯ_>eVd-^ܡC.;fX8ubc_F#%{y|>ʔ{n͟!  ))O{!z`Ȥ„KÇ7wmf'uܜ,k.;yyz8q-@nn3g/Sjkֲx\f;nD(h4h4'|Zow}W"{۷Vm?)?ϟ[Uxذarya2}4fӦ0R9fX& NRRn߹+eeFR[ZZEQArXzK !(PLQFLPG "oJ_j@"(+4铉on׮)[[:)_NeK󋊊Ϗ>]ZiN8Ӥh ܅BLZ&{-{ - 4# 'I_SNÆ oݶ}ǂ60!jD -]F/7/,66ƳkW(Fܼ^ݭ[˖-_Nv=.ݭ۴t5fZV.UF vvtz{+,p͛7oѢVB&ųJV*xoC1&㾽 Dݻ qm?uoΫjH= nST5F|/Ϙ9.C k,oU*Q~~~~+/WTRUF*LOuꗺ~Enܿ[!5Ŝ IDAT9s|}{vm .|hooaÆ:t]t_6lc޻utRZe8.]:!CwҹC()KeﶼjՒKz0wg8Pm$JbyԲ‚|{;o,AѥX 6Ky;wtwwnټ93#cG}*~_/^\[ŢWo\"[ҭ0{젠j֬YlL |ESNp®{nk׾o~+u7x_N-'+{kV@ҭ}]CNnˋ-~K|nN/[-$Eoޔ⹅DhB՛|XEW v+99:xX?N1/,:<,eRYʍ7;02Ҙ1B_=rE"3/%$y\nfVVNNKx;;;>?q{$,,j^Xn8 S߹w[^l{XIyaPQPTfꕮ {|C(ϘP/J]5Q_N)qvv睝rrrC~ffUz#.YyS\^npE ꗺyƸ{wr ^nݺ;wؾM(ջ]XXH%<Wɑ^䘝m8JmyÇP1f}祾bm٩AU|J?o󷓓Ox?gû|aLowj\Қ4iiVVVrP(x< j 3rbcE%? ꫐!=z 2Ϗ^޶mۍ7PueK>ݻmW0_|immm8 ȝݖxZZZzsVraa=q䐀عz`1A残Y;hpBȈ^Yܪ":z!;uzw;bi911tRp\.'--u^Z?h4@QZpƈ]OfLLC P!2wbNΥl.w-Z`Wz`>~i&GI&ݶa6#NDX\^TTT* @&YYY1-BDJ/˖JNnJDPeCU( /_|֭ ;C۶Ф  $Xd:LDg!9uT6\^;w޵wHp ToCDP0k ^!󝝜q޽kWĎFGD!~g{`%MSRB|i톄,!H8 |>_$xǫp|: 0oC3u,UէO{{ V:K@oʼn63.CUA`~E~>5'<==]]]MB!ֿ.uww|Pbh]RT}) *j`T7{}(:@5E!b&)M6MJB5rpG10VXJx-[6j6[}NN`oR)`_!j.- &mx)@zQ|_%#t& }:!TZZo$f2ոk͝2fReTW=6 Uv|)!h4*("___p8Tyn)!WR+e(eg{XLFfHmמ$2kS/H(vw}+Y,Wl3V+p~UQmRXXDj2ԱFMB;{WtJ5KQLPoft.B6zR;t=rtڵk@W_}պUϿAjɂv2lA&R(%Lfi4)v;34=#gg9a:Ftڕamڶ?ݴ!ո 6mvҤI" J& 'F֑*ZPPY[M]KfhL%?PpmPp![ѷ3ug͡z MQ 5u`E&W3'aIb5|,9/^TT7oߦMLVk<k׮!!!{rauF#,k׮frl6T*՚kN: GWϦ]vjUtӧO  &3Ȟ\U5t6[^-dK? ZT*嗶{3gnxxիjbcׯX(99y}VVAAAW^+WJ$bww?__~%Knݺm֬YeK|fF֑#G(Zxq||9stbߚwq,Ybx16|[³5rq6dWbѣsb0sW@?,z& ۊuDs.zrgL1|p!!!VV0bĈ)# 7o<9o޼SSɓر^>uʔ9s߼y[)>/,l׃* q71PeOjJ1 zitk}àx>t-Mنѵw7ozSܽr9w_"J!Cl޼9/7"K/-\h>''ǒ?srryg'眒?'333W^q=]dgg6lQ F4'؄ =S5gr|[_͟?w=zBL֫Wwb?_cǏQK,Y^6i/_Z[[떧ZYYZ*v}xKT:qSNYKW vL6^8}k cǎ;vleJzk׮Æ'Np|M|=B-6+3vbAX bc34o޼EK ٰa_-)iѢEr =,Ȱ ˂T{dwc8] 7bG>}V~5HT Ǿ~rF c.s-Z`%I-ٳ,wIHE"{Zn Ї>!T ( \MT}t<8q"ѽ-N9nYpZҢECd>~Y&,y!Jggs&''?| lL ںYXiɩFblUABVrH(  6[XTx+V3fT5f\oaaaa`2Q(gff* 'G._s?S@: X,%'OjѬ#B[ܻgog'K fu~R,R\ PRTнHd ocC'b5+B|>ɉ`0޻w51K,;888:8*mҽCCץ_^lG,.2 WڴyJ!`H$ccm-W(Lja"ehS ȌM4˰% *]!T7]6=c̍6@N8nǎ{Pc,[s7]}-EyҘ}[p6gnj߻[LBPfnzׅBX:ұW{G( 2_|^>) ˢ1Vl  Į Jsrr~駐sto^ƈP#BWy,81AT *K]v0SyjUѥXw~qbb腃|jQ㵒(\|O*\&ר5'L.1ms:@kYXkkkˣ:YٙY<$HtY,V>!GJ-`E-{e$IڵRЊR8*PhoGgJEMФR*vv;2 J>bbĬ?‚TTׯ]>}vʳD/?3gPi>ɟLHݰqcm?:aFBRmǃjR(z wYSJJϞS*zvL2۝->x7{@ӦMϏ5{vE"QtZmmm=ve|Cqbb"ݷ72r?X4kɓ!!5_ !sf^nnW20j',޽{@@Ç܅t}ܸw7p@__eQj<==7lPOORЯ_?OOOF3`@]AT mV*ˣ{fbѻvF<|C^@.\bի \*u+̝qS͚_^xɒ)_N=wߝ;w&%'kw}̙}D6|]>vXNvζ IۛX|ѡtޮ][+++{GQf 1IQ7xn!D.Z )(Uɷ/_A/}m<0"GJro.FFF>~DP؅1֯ߐ^׍WyTxڵcX[:!!cеX+σgkIߎV> :P)q 9rȑ#iӦ#.<>}|d/{t;j*?~ J-yyy=xs…6lXkԩ:t-ݻwxxM+*܅1:uGc--%SN510a/wҥj cQYk &[J$>1ALmoէkv5\}Kb*氘ۓ zb #׳NZ,B+**ڷoߘ1cLyA!හlKi&MF~8ylֱK@!GxG1Bb0vvvrLfWw2l >9ʪB Cp8 rLF$=ZnnX,xM6EEEmE_OVE]B!3d)dA@ rZ $Y,IJI&Zʪ-ifiғY' |2Ljl6VK?6Z[l +B&hTjܥZǯyy/_p,Vjz0C-( A1V[uHR+;&B5N$NNNDn1)֨.p$dVoݹsx{{w֭_ka2#N.MHV&:ԨiP*-Ҳ:*>,) ݍNL[\hiif/\ŋY2ٳgΞ]2ژO*3GdAAJ|whXpIPHmm n+` r\T(JHF]hlmm_WW۷o씔{O(zYfݺuϟ BgϞKlv6m懇6$}aO[%^W\)SdHT(*OV IDATqLP5 $IC9b9)VKL&d|j5 [Vf---Y, uttp8ٙނÇ_xA$A͛77FSr (_~%rѢ~b3ݽ{=Oȕ+W?w֡Ex Ps:8G( +++#JRi-Zl)ѳgOOOO{E:uJtҺuk\NQT@@ixc>^ڻw=}gϞK/޿oýAQ#Ay6B xݺ{h6l0߿{5Sw6lΝtEjp( 'O5g94`d@ 1bDAA4R<6moC [rZޱcdž %J,-&NW^Kncnj)>F c'G>k.?=\TԊȅ{;tO'@b⵶mۖzJI3jP*mɒ% 2q6dWPXsHutUŲLIW/wg\nppp`s̥Sc@C)C mĀNoggs5_~olܸM6qӦN?aF ]7}{6ίܦmk@ks)QT@f4'9X3},.Q[ 2o߾={;~O,Y&P(rH``@ sww EFfիtˇ .##pÆ J;9Kڵkd:ݽ{㣴 Ua۴B|U;jl6ZJ"IRՒ$IУکj$5 hn… vppcLfV.-5)r7O%JǏ2zyy5ЍkdA} #WDؽ{ĉozDQ&*eSv۶mӴZɓ`֮ҥ_ P*RSCXbcbS@o>. ?S}V`0BBB{`0=rmT"Scُ=d0;9ׯ_eddp8>occS^9ֹ4Iw‡|>NdkF39f +)Z$T*SG/6[XTԴijn)~,$Ikkk`0lӉfd3 UD9)~: ͼ}qS,BudJ$Dmֵ#B׃[ܽcgg'Hjt؆X,FrZ-׿[g?jN6g^xu&֫Ώ!|>ёAw޹zAH,rwppbKn^j|]5MB D"p8LD"WVb[̡VZJh4*JV+JF#5 u7P-1 |>Û QK:oXcN׿FQtU(jNU{[no/葖OB 6Bu1]B !ŵXJM3!Pu71c-!o]5.fcZ59BZc; dfe:EQ`Y5^l6dm 8ifmm=xȐ+b CBUН%Pk]LKeUN_N̬lZv획6(m۷:"PUhׯe:v$I-8;B&!$y$ݼ!b`3fܸa[}۶ # AEE\/pww_v]Ϟ=m[ٳ'5g'Ϝ9 Gn4ij_IiP蔖fiY~w[3Ϟ\/X鸠)v޽{sfϦnٲyEݻw{ɸQQ[׭[7SEdAAZԻ'L3JmAAAyRZ޲e3 4Xp:trcƎSN??B(4RR !|)S`ut 5[ __/uǾ ?yd18 GRP$Iѝℓ '@(jPL7ZYY}sL];zn,[|_9wScvΝ;EbZo1kļ[z[dI-Cܦ͹9k۶}ǂu)Sx|ݻxru|N  0\PP"ZXXޮZjmWԩ[mk3gͤ?JJJ:q͛ffg988DFFVxa{OCn横b75RJ͕=j)X}-KƔ*vO&NRZ]ݸam[ M[ܿ{WPۣrJmmmˣJHH0\PG$Ze7w~ȅ 7mԼy29dSr)=3+kuDzXz{v)BBί#aULsRwMl|pGJX`}|BL&ׯ߻EbqϞ=8Sc_0~{>9b$޸qc֭ mmeKHMMZ022l^by6mbbc(t~>&P(x<^6JX t-vրkJ#.5BJr\˗i[J׭[ 8qW;8:t͛[m]f Æ p3gΌiߡ ~E@`Ճбn M EVj1긻qoח^Cmk)d.*4kZ149ݣ[bLfVK,׏\pÆ習Jym˳+g׮,Ѿ}<I&۷kWj d!^^ĴSČ5 ?uO8~b:z*_Mb=  DprA < jZ,B x<AռcV)$IV[A0LoFjBe>)VfffW{21L{{{TZ !|RR{n]Tj5%LQ<֊O?KL&`D 1 2#b)*ZVA (NS.e\t-\.ǫA!.72   @.3|"FjW`  񺨈"IA0:B`>b@dׯ_gee 2F,|L!R,`2\3ET*ZMEQjD"HDib0'Nb2Z-="B&fLf$sKIRf-Zr8,ӷ=$ɓk:hj%%_5//7-5fWm;}%[{ljQ** X,f0Be˖~z-@[$I6k͍^رcsݹsG$ B(L=VZ&رIjerAX,~ϣ7D"aUݤtgجÇңQ$I@Ny~`2|>_w9щ 77/^PU|1X\aQQ&MZ\FNNii)֘T(ʨW>}ɶ;tB(ʥI.KRz! Zd2౴lݺ5UN}O􏠞FwKLE!I222ݽg}jXL$ɂ|NrLNTJmm޹-ӟ9b[y }.S.E N-7'J1LGXgdLf6m>>  sss3mH]q<ڴ8a1=$ J&I|" h %I=rVL ois--{uTlll*\.ŵXC 7UU\.I*_+)_xɒ}{:"TڜsLB9\͜H$jѢbH鿈[ɴxPRe0u L&Sdz9%Z71ϟߦ ۯ_sB˻#`(j>|X^A}*jU ?`UU*.]=j8N8x0v]*>AUx Uؠ1a#ˤpSMgX&)J<|Mk}q>=>f`Xh4$ۆuٜٔ+MTzN:mtϙ=(#.O8ut[!ӧO9sQRR҉~۴kqYٹy *3,,B"q{8*{PHe7X#QIqB(llIULfbf[YY5s.Ͽ97ֹt_b0ZT-0tMn:nkH9~˽{;^[[[zf֭[(.'\jt\''Gz)''ZUf׮]B(dl__?ûwmT*EQJH,\Mtr~m #gϚս{wP(nXܳG㿝(ʷX,6`)VVV/_tqqԴ4V.\4/4D*ҫYK OLBAy 5-R*b2ҵ/Jh47k̾&Yn 54@_(c҃IJȑN[Rp\˗iV.G9z*o6l]a`wAڢE=oNVFx𡫫{mjf5o}I$ Žwd_t,d?ε'NI&uܙ#{W^Y,ٳg{% MzLe{vJJJ˖-MB5FЪ;wxۿH1!//`T*:jZRIgYM(\.f@j({'dr5u[Yã]J);}y˼B믿\\\rss L&S(jrMc!xkӦ35Pl6ѣLfu/]{ XҽmNVONeV^r%--vرBޞfD"2A kPHI9¢IM6&E% 4MQQZvtqEG'Зn%V/^HIIMӽHBVMNNN2,+++%%dzxxD"SǎP [\6u8Dv|>j[bxbKfrttq2y wVU2L*sΖƈ`H$bmmm-W(LjL'/775Ū~ObBVd;w!I\.3u8Kmo?Px(ڔZ]ͭUg (**jҴV0"SҨ5|%s lL u>=zj5k$ɂ[[[JI!N&Jֶ$ŵX ̣2$ۗ/_:88|ɤYg3 x`0׬]׳gOrŋGEݺu(iӂg ]>`a湹6$ IRTjjFT$I響 ^|ĈOFG_a\PӔg|s޽9g^~mxʗ_&&&n߱GsCBvYRM.^t⩓z-Y d!]H`>,H=)Jr8p5J^G.]4>ȯWQF=zppСQF5IT$hRyA6۰𐐐˗]v}޺}oI׮]DX-((t۷gef˗Gرcƌ/^<ȑ#t=rȰ mN>%>N9!!!3f̘1cQRRox\nVvvnn}DDDq͛G;8n\7|clڴfϞm`cǎ1cƸq,<؟^sΜ9̙;gӃ[U][j!d.6mIULfx-1c`k|R߲&LXa)~O&޾}]v~PRm@.^x3g|qq_ N֯_=z7??O>]˗/7\Pn#TǍSNN=ʕ+\'+S7/j!NNN.wNNmΜ9CQԵkz+8::cvv5u [ylCL9Jjt6aÿ"/uk̩Լya1]BI -MLL${ez-r#ۅ Κ9[BP& 8"bG'~={#S++/_8@ZZ]SU- Kڵk)JH2zUT(<\ٻﰦ6' Y8lm+{u.\q*ժk+ PQʒ!~\B!>7'ܑܼ{rssvdiӦ۷ɑJghh&PV,5{+VM k[L&p4B [XKT*}rJ||_f5t}x<wޡ; qrvV } ~_QOК8{;UW w!Έ#]PPP^^~ ݛsȑGH ##JJxQPSjٚuO6?T\XLF10e˝D"ۇׯ[?2h}xڴiwnЎL܄"BյVk7޳gĉ!OO_0ׯ]fA֭fe1$YqJ]6|۶'Op8gL{n͙{Yf! AдSҷy*OOϯWP1*ĚSTX@gV1U>2ߚ<ıCk e~mݭ[ގ*/w|ցtp\]hkƈD7ozz E"hcd2B펍j7xR{7Q @UTTE6?Y520@SׇR, 8H$QKM$kk++,52:آ H4_&P@ ҟ>~dddӫi@EP+*<~ҵeKn̎ DbXzׯ_wrtn@*----1fXmsX;Xp#ǯioAKPtΆ =`$4Z.]bZZIm )FkaS*Ér_/kP0+Hbi[DI! mh4Fk^br]NA sZ U`וskH"t:FIŠ 'W)_#!G DZ{A/8ږ;Pc(I0Ў jӅ(hM͚ pMjɏv%~Q`j|B?4[Kv#Q\R2ŢP(B޽{^^^<H$VVVZXXTVV暛WUU[[[x񢤤MNjjjZs3-:$)O֪=}𡃃CII @HIIH$ %77R妧3Gu҅iN{=;7"3332llllccS]]ckk'[M,嗹rcԢnjO$habX)mL&H$QUni 1lJPVVVrX,%ƚҞn⑨~hH$-,-lv[:/mdm6/iy&!<#=((4*,,Cep9vvĽ,:6 j&.ϯjp@b1{;>JIU2[e-;Ik6bG1oDDn^=Z)M\!| Dl / }FS{-qVݬb1 +hK"kaiߒ>NڳV|82er#]-M-eaIi_O+K$K~\q3WWeQwhhM$IYiؘϯ?&A cγ4&A$~)\zBŒ< ￉e˖,^lld4CH!hlafb/:8wٳ `mjO7d;>A&{݊vvH,h+D  %Y@%AH( mR,Ҷ+  f<;n\HLH{X^^~ݻfgg;88j`bEڵ?lF92?(7ZDgjয়~ڸiә3g4Vڡi:/|[p+:6 ]dÆ;eJAIɃ>}ӻwfeeH$#####|'޽ӌ799zS~l t,Ѻ6?ӨI'feOsss֬Y;cU+yu tw;n@w&K0lɯ32QVҽ3g?aBBBۘ.ݪN{:s~· 5K/0aW("F >BP,9roWHhhk?0-[93\݉O[, H!dbbrB %33!TQQQPP`kk[\\'ɹ666=jJٸ-^*!.]ԳWk/_y&P}ȨАgNFGΝ09BÇL&nƌ(9lU-s,B(,,-SRR>d2/\e:}71'h̙3/NFG3z{;t+-v5kfj(1DFs9z[v^0pB鏅*++ utt8N׮]B?.//777̬իH$_EHE,jS7'ΣħϞ=OPo|;~ieKB~~W)J??_3J(".+535]vms ` BK-U+WX,iNԛƍ#ML8e„Wك.\pY S,R6D3E8P@u*>ruӝl͓`.J"ekbmc ZΝokO7 oFEF8J}/_VWW#d/_bllO=zC?YzcbbK7@3ډ.]bi9_B4*dq g̜0L"ȍ6aU=hoCq[RR_UUU\\\ZZiV]Oaa{>WWW_~аJt3M"Rcƌ9rtCH%KﯧWUU3lXY ƀ/\ d0g1 K=^N%HJEuWzgiaO*A##\ѣG9큩 bފUr;N]v7Y>SsssG!m|{{{D6`*O $'XXt>PT*܈;7>>>!!WCC7yV$a&HB&]8Z (,,ܱkQQ%%^Hoo%;8bĈ{WT쏌 nj#''G,ucuNZk#2@T\qn@b1r 9dGMUUUzzzP(t:=;;)D"o ׭[!cl]vͶ'cb8Ό&Jgw4cL~sJvs?ð9xϞCgkATKP3NLM_ oMۙ%7re~mݭےViZq7 ,Z~;ݻw;T\_-Q=zy`]f'u8vr"۷C|H+X@gF&)T;U2i-;EẁoD"%kO70~X@Ga9XI?+U (9tS{"@$VDpXdrF+7imT555&=ԞH wrAN豑CO'FP+*>~liiw( Y'BH)hO7'ԋD"X׮;99YXuDz16bX/VF b7~EE>!͵MӞnjM Fҥ HLM}t01ᘙh6Ւ (c(ixmDD&I& f h4===½Ĩ(xDeehO7'4@ tMׂNGTNw*)V=1jmu}!ӧO @4hX,؂B]]]M;'MjIծoJ77Ǐۗ6<D"-^x)S4֔?<`"MMkдU;.tznn.Lx>BiH$*HRC axզnjO$Т[kF~X,$uirrr &%;i˭v JK{ƵAhg,kmm#N0X,C&I$ZNk8;u0ޠcD"²+nX@r2uttTN t\bwquH|_@X,ӣd=]6FV($`AVQQaem#J_M Et]] L}}4ղY#|m8.\"u,@KI$r1_N?# YZ$*Ӣ3X,Up~L %S3kDjTV:΁Lѳw+Vi,&D8гWgU@I$F(H:0 BBH H$mbPl]:mtx^fʼnZ 駟6nt EդejѠ}j/k$!lҝz](P=/K>x5>ɩ> a*←:Fdg@@@\ F:HJ/ieqK.4|8{ā4?4*uĉǏ?ٿ?aCHf /[46.b\,~:a&OFץ˝Q@wE^p_ݪUd2/}ҽffeϞ=j(կ{LY7]pAGG'$$~ :yjCnܬ" ki]ݺTBydyY?\#=ٺ%ٙ5C˽LHDvl_B_\r~熳?7`(!4{xoǥ'`U}UX@ tR^=WY|͛B'""CCBҞ=;m`;w~nn2 [;3f46G)Ϝ> ;~ĢE e_uUNYaߵQlIkݏB#YRx5"O)%\ |YqBC{2B?< D<<Ŷf,Qz8N{,>AR]-]j`F]+W|(+ 0 XliKP\tڵysha|m>>c&cJQF8P@u*um@G;7ā^aez:0=-V(*"b !Ds4`dkLQ~^&$<>mGBD+xIK:!nPqPvԬ[uVlTdԁQԧO92euu5BH%ѣGKKJ0s5(QV3ډ.]zDGG1#b!iX̢a_MhUŶr1a6# 7[79)(qHӠfz:U(a4Jl1:J1BaH*1[OGZCHRnjs1醐K_OOgذ0_ / 0`(9#B}^>ahhX՞={DDl0,~Rx6xweAǠ5>Jbմ\E=-LB>^rBC3?S"$4gG5eo=+CweSHhB藧%/=/Cs1$7veޣ@ HO"}JPT;v46o|||BBof*)ᕔ"Gx{{54t㛷oE"abDn r䢥{A5uq}inOWwDj IDATI/.Nzӳ3WU Bn.0=+KӧDՃ5ޕͭWt_.^".iL_ :D ̴䓦gh]pZ/PH$zPj>_$6F&)T;U2i-Dg:dԽJdgF_~;xNMΣu}ӎ4jnNQ(7B-Q @B$^ΰ&łF&32^[vV~M+5M隢 {.c###^MMM[G:/2Z^QcKKޘ]K#" L2@t)CDt4$b^vƺ#׫4jŎp2U1BjQʫceB_g:ԏFu҅@$>MJ΋`pLMi4Z R1.0# t O{ePu =ҟAHd2d2ِƯ@hzzz4{)VHXeg.NhpR1hCג Ղ (qb hX@# q(>zz\k6habX)mL&H$ARѣ!#މD"Xlaٕfu,x9Y:::NVI܂|6hnbU|D";㽨`NRtuO?ajj*(;;dV`9&:+SPkfaۅ @UQQaem#C~mL$ZXXfge뷤bcN>#x< ҀD_DRVV16:]2Aܼy3$$!e-Zp1L"QБ3J޽&z%zyᆔf0Ů]mj3yv˗/jH$fB-?̫*}F"5B0nJ?; x? bdhI#X毿A5eߣzÇ:t(88X#AH( InڑScRD;Byy"iYN~^"%bXl֪!jFphH !W⯨q)6#F23]o>{ϛ7[Gw{/ raX@!(죱jr!$qi;⑾GO4 Q xwRҽ{| @ǙӧϜ>I$L"9y̙3oȪAGN֦#_,nZǸcoߺUQQ?-}Y^^Wks^={ҹΜ9dtՄ*zaKR9}*?n:o޼۷~=x`jZZ9|!@#?֮9rBiϞC^fҤI׮^oee9}71'ǂŏ;^TXWq;;;&Car2^ÇL&ήfQP#7Te^V\rys*~Q{8|!4mڴr|]iYYBB·~;rdŋxaΆّ#GRSS/]|/)JܹSzĢ߭Ylٲ䔔Υ<~d#Blx{{oذAq}ǂ f'ݿ{666A=z/1S_o}~޽B/_⏰5VMn_Du-]bs;tAAބW/_nb]pҗl6 00_BRxf֮mU+Wr86uڴ/_)Y* -]j`P{Zٳg\T*v/^~ <$&!݋{6^xmp+~~ mndCmP|ޱc箝; rG)~ Cf ş6f񏍍 _BLMtu[͛͑ C6ې JHHiTjAAA1kޥK֭M6bjbB͛&<]yT `\)Zv!?z*a W^LIN͛7)&kҁv~kFٳ!ǎ@$]PU؄e1C툈uaWލotujܑ|~b錎Ŕ)SLa??2!dnnѣWϻwz }tRY g̜D"{.ff]ptXXxLLLtt# `@wōX,|FC(**ڳ{ώd2EA!ccctӧ~!$]4[lnn^o<KݱjssbѣGKKJ0s5(hY=jc䫱q#GٳG]w・ZH?wٳ1 ;|̩SB]nzsHߤIkׯn }}}O[X`uEEEtdTԡ8ڰ~OōTM$5P]w>K{Br 8&&r.kai?rtAAM=B&Sƫjq&vak FEG;v\(ƖB0,8$+;aaGG000 WsZ#زҷo!ѣD䑈=Xӵ,-,wsaxёJbldtQӰyyx r={DDl0,~Rx6xwō(I( ]lxcƌؑ#{:$4TRTdTI ?/ [Hac QҎ|89; @@PT;vHGwނ |k!~+ٻСCr_?_?_Ͷ݅v*WML8z3g2cΝ}ryB>$={GUcrSL D/_\b¶mۋyżm~~~x+_ed?M6"@`ceBQiԠBG-.o !:jjubMcKlnxBffgΞ=&FI:p ~uu^~~P( k6m֭[~mܴFPjёS7NJkT Futr-6eZNnKzg̘yY@WMRs3g?A_5|pЗׯ:lDIׯ_߹sōPϺu"z/]C;gu'NhVoa'M4i$ccoD?77H$\]7k׮|pa?W7š*󪱱n޼!Ecr;}8ַo_BQ+{8mܹYY}icrwus3eʕ^C\\|}:!Ⴧ(Mlٲ;7}?/{ ^,HdO0#L~k,eOxں[^NMWmEv`\1Q:kδ0=ڗS'-_$jNvqqqY+WT={>16 H~^$JUW^‰L&Swn[[[v'eqw:{޻Gfn=ڥ"..nmРv.csSbN8ZfմQZٳgύ5D"BKZbGNkR7ݝH$~:r]&H_gt&j~z"֭73=L@Mr_.LxEl;;~05ϓN>3+^kEnmm@N@ O=622bȭBAj_(B-xTS4v 6#H,NNNr.} @ky16bXpKvU4Lg$ Nmh4Z.]DbjӤ{m  nKt[o} L~#[=.BD&I& lEvh}4MOOFp/1T)ގz]nVl@@ t'6D Z\q(%= %@D)VvG1@:~Si*} tkmCmmjl @gAR_=z\m=[Vo:bBZ)HF@4BS,؈cll z} _8^XkQ""Hӻv, ߭nzg1c0BnBE\G@ޏv KKK]nګW~qȸՖ,Q6Y^444|"b}}iӧyf[6P"۷եo3S}+H͘ҷh]w1<¼y3.!t w+////6~ܹ!NgΜF>̪eWKI'7T ۰5HXQB7oFuW_yݨѣ¶FFF1cCBCWZ,FF>>>iiOB7oެ6l\PPp緻YAAΜ9~:Xfnnߟ={B|̓;*+?d6s EikddrkΩS1hE#N?nwnt2ųL>!tPBi B(8$ٙJN2!믿减Fq8C#m۶У PXX_rc` ظ@l^^)A^~NNÙ0qYO<ݻ^{lpLMBbܜP׮V-ѺuuttfΘ~]XM` &#||OMLLBEEEt"[?I7cjųHI&sEW'&OB"BKJwرY9! -,BYY-7 x}[!!o߾Yj*@Ӫ)[lYWw rÇ C"fΜ%;С#>|P f _t %!%n"o"x`?{ֳg!d2^bB޽T ~c1閖s  .v5.>|lu4iR1!8xCXXY>mmm#G_vQ 75N?~x>FFFWQk3fܼi§}i&|ժv ՝  a[vf(9CݺrthX@gOef~I[@'eqwӴ@)HF@4R,b hX@# )HF@4R,b hX@# )HF@4R,b hX@# )HF@4R,b hX@# )HF@4R,b hX@# )HF@4R,b hX@# )HF@4R,b hX@#b4X,D(@IbFu |giD"lD󍌌:MhvD"RGD U$JŽJ@! hX@# )UNw0@ g@KB00́0վ)#`Jj"^ C : V^?df&`5QëP5j=0tCA0 Qݢ0‡놴vVie죾'hݐ"XdJ0P7p" ܵaԽICҚP74N#_qZ_RB "B[DRg] ]VMVFu~ y9mu=# ү`?L6ʏk~nX]]PtmtucV;ֶJ_ 4z$_]>CM$t\e\X@ >|Nq,c_~a3|z5򯑚r>s }I^ Ad_R-9Wp8Z@Y)!'}S/=x|IDATڒ7¥~A^|yѦB#[הoUOE/?檫Fmm4R,b hX@#T[abX(1NL&H$e~C-iHXQ9*XH$-,lZ<^qNVPRrЀ} -löx9ʯnw-UU|X,Th LV/GG)z$Inz49>"Q@2nw-d4JQ@[QQaem#|~s4ƪmt _"N׵ח[YC*--MO^@ 88tolZNASJ} H$]: M|u-ivH$eecc>J.km =⥝"QBZE(Q֑W){D@&ؼbd5%9XF((wD}K{Λ8rgP,G!ֈ$!HH$˖.ٳ%KTmC{ ~=1,,\n{;W*/BP$%܏u!a0y8t4{> &k8&CW )A99_1Ig&]v…@~jbp.> ayz2LM BEaaу {fɓOa[,hCM;`JkɱqFWDbKbt, !!d6֚}gIիWҧ۶;9;-fz 1cBٳZnBWƃ!!on⛱]5{{޲e 0e8`4~;Qو̜zx}5wS|t(CXͻw۹s׻wuzwCr/%KESq+Ž{WnQS9w4j[pH oL,GvvߓMQd_t:ۙ3oKɡө,;[Cg'MG+W YNj4JGVslmǍ=thp;[[i{B^ᇆj~E a!D$=߫^$M,oDz{V,ذcEζdg?x`]xeeƹ%]r }a >\f={iarsƟae$d3/-X嗯^!x'cNX*,{P]ز&%M Yt^jXaa9s jja2'9$QvohQL/_NWMKaCM<BH"H1RT2J!S (}(d2Ih ]f޽5/ C}q{޼y\./noر/wvrZvt ((eCPP@s/OOL"+`gbh]XYQ!ma5NN_|Ǐ7I5 uS]Q|rWYly5m<:i>=S^5$$D$6B&O:ԩS111 uGXSy\.WXS޿~nn'NHr!{jϞ56{$K:h@s\W[iIiI^~e{053+`Hُ9r/>O!Sˏ9"%pΝիW:tɩ5W7qqͽ.IKN<6.p-6|E`06d ֗+tuGI [yprI$w7…DVGvu&әﳄ5B:aH2%g v<&:AwolX;rd^xxWo438rP!ax-=jc&Jrb#,Q:$Yݻs}h!  O{lllK+W_XTT~|Ϟ=n֭УɼW=սG#G^|^RJݹs'^a߾}w^d$ ZZRTz5ѣ,}&1ңP%b~9tc}U/vW6ڴiee ~ȑq/I;;;FFEezu;>/Oڗs!67lذc|?Ǝ)nauQmvƳzo!TM nA~/|}򩍵0%cC@4GO\|EzzcÂ!ݚ5˖-KNI9{\MCP Rɿ_$Q$!HCD#&u`eL")ڊEpRٿ]yT `\)%((Ȑ6dWF6\za؄ b qq'G?~j͛7kJH!(Hxm%bq!KŚ%pE JT "Ss)=OGof&;Ç gsccc55nzkW]|~:鰇iy=\㏔K?_ڼy۪Aܺw'n66f^fo?6i&޶TN^~avfwbv,eoX e,>UVV&m TH}°3N/:a6w`%kϭx`¼ Blً?~U9tн!C>yk׮&֗z<)N7B2-dℚ) ,9XEqꃔ}7o.<<|2Y֮5d J-(((rͻt ۺ~eM |dըn))v| @6bnaM\.rB~Fٳ؟s-B! $墢"ia&#Q@O5%LT-ĈH"AUy/ަ}'#6MdoN0=jlʠ~9Xm9gcvS0,-:9;ȑI֮_!TXX(IYx!FD !TPPi#Gʌh[J;[I~jok`oJb7kP(ƄĻ޺ĩXRCk 2,i[6/_Dt'quC}i9_{8^5)_T,MG~:uMHOoacK.45kTj!BDd^8+GHWzc2x0=|SXTZii骕GD U㘘ȖȨC8p@Oa!*}pV,BD"J04afknH񴚅Шd?ROϾsvNv$00`8ճʊr}A,M ׷or`"7'-uI{W4]W׾O Ϟ5YZZ+n6Mh9ϳn߳zQ^ ^喽0"(o>M#Yra:::#b>H龨}ph66dLDDgf_j_%Cw?>7>Ntu4ZԬXh'M srt<|!xCpk O'rO]z69_gϞ{II;o71cǬZ?oܔ\j{7{obVK*r]8?<Ǻ2-okĉЍ #ߛ7JEpp TS^SSSH-&whH JKb884BpHȰÿE&wX0VX*#-H,n%[HO&i4]*u<"BѣR4]*EGXa~~o%[nݾmK_ٳf|Oe偁FF>>&&&x k̟?ulWU+Wz{ Y!CF}Ӧ#iz|3"3q/X;%Ae?~wk'nCFd /1ɣKM y&1*!Ѡ&y6 s׵]?[kֻ߯{z_T]sjUcmV$Z^?\^S>\}}%.e% G?1ᨱw}04}E!EC3 <*pYw_?vUuu^occ7Vϝ@ :]e64ǭ%ݵ&T}YvQ-m/={vW46n ۷z՝wΛwzvTwJqHQ)?\=weΝn~:FS-) ޽:}tg6j,(uuXf9m޲eӦh~xGmeqx<~EDd9)6mykwGYjuaHrCDD h =ˏ9b#*~_qq8ZQDb,8b=?olxe7.Ic~,{yhԡy$EQ^tozk+d 6Vxw磯){NoX)8bdX y\ 8E8vvJ bq[&;i BD\$ylVZ[ C`9Έۖ m6XHQ,r`2(Jr`8.Ƅ/{77ݻw!P9mW7/]3|6vܻOܷK.(ix8C(w` #_u}+%Lʙr\gg{;}b^ F1"∎*{f̈́}|v-BGǷ$鍚a"e՛$&K ?ozM+xxX]䒳6yB󜪐E3t}""b]kQ*ʦ>:"ZX0"i7VF;3©Jkk?h jo c9NV*ܳޟ挳#rn'>G0L$|qpslX4nGO٥.oF╅~}>@`8j=|xW ږcUDT~g9Wċa[!B<;J49BC[xA0'S}*n`QǿɰY,/f*.)ֻKPuuv'ueqI8p'{+$[ 'tD" 8 C2nw\v} ZBdoDsKᤐvN, 7uj$Ic @D(l6QSG'{+$[ ' 4(fF4MSsjxN'K+$[ ' Vn jT yn].4 bL!bL!bL!bL!b$˲ XȲ:&]"s$IUU񂕈X]$s,˒(N;6&0.,&شJ܅9N+&(KYN$Ib kK`4~Rg<J'+}-(䯍U^O|{{@l viB4>4/YIIENDB`knc105/doc/cs/knutclient-cs.png0000644000175000017500000026071711436654001014625 0ustar dandanPNG  IHDR+ pHYs&cu"tEXtDescriptionT?da okna: knutclientPX tEXtNzevKNutClientA IDATx]wE6v &dO !(0E zwz愊t'^0x?( a,a3ocA>vuy䎹WXk! ( gH \#&& IlBBᾝB$O-*["*~LG2maJ)pU}&*T!?O5Auc7J~%i[UE8n{|xr(=,ۙ_hÑ&eD1n8*qV֤x*ÔKcR`ź j+ L2USKn)v=M_M*{qvз&h91B21 4͊d"?{8 Ф$Y8${+۹ɰ!0ؖ-[{ꚜ4k^ck]"V%).3 ~-1.(;JAXl)&fqTRnYbI(.*4T=0(ذ`{j~$8r0 7v\Sݕj RfԄ @>} K‡K$y/q@] 4Ω4]4LRLSP.>)U9.;h΃ I<ؼ /e0Xqu:S&׀:uu; l*Sݒ 1`Yg2@r$BbQ&ln׏,)Y.8[ q*G98\N 0\B  r2-zp>i:q̔ذ Tw鴗VM؂qZ`~7iygpݫϒY0E#mj Aպu_~Ϟ=VJ[N TӬYҏpxꋵk5n5oּx۶m]7|NK[jL hL"ztJ8GU(#8[[ b xl]l}Z$$j[rX(CŶiJ5;*؈WM9IBf,&*͔$T*Ӽ \`VF5a@ɃGApXϔT(@"xz80PNLuEs' 0I" Sd&'m[H\{0F֑4t*u$YHA "p#_oBU(٤_7r3NՌd.Ɔ87= !4b ~VuƙgJ)~V{/7`ҥ_ڵ+*.....n߾ƍϷq~Gap^СC{Xr!? SNݖe uk׮]7xΥf2;.67~xc;v7lp9gw\+XYÆ]N ;vsgyFΥ}0,wӃ:;th߾};!ݜvkѱר8nb^H)AM{}h>}y|7}}OOY"sˆ]O&]lڴ陧ƥ,+WҴR9IIm̌%&PMZzM@D XltH)(1 Wو>އYn6p9mzaǞ\R\JX)4?ᬿriTRW$ ?4o=jԓO>54jȏ0)Pΐ!Cdy, )NBPŁ۷syf*]t}ʯ+**JJZT܂'MT\\ciӆk'PQYbSR !'ߵ{wgϞ@i֭gΚ%UH+4k}K FA),2 ㏿;u־};+bX>ќ0o;*,{,[~Λ7۝:~@A;SU# BP""Y\`9pC]ˆsR+HfO*LEKM4"p^yv~-I:┆O{q|PiuS S8r p~,Ù (ȂԹ?Grt8@gʶ<Ϻ9W_5jԘĴu$ ӬY1c<4GnٳԸ㊋dҏ0)PNM5§ 9#8UXX4櫪ssrfDDokfS~ц 17k?~I3{ŊE|}yhN/<0x)Sxzp(4b䕼Ȑ!C&O}ѢEzԩS}ݕ+WqJD$I.?& RxeUk"'D6>eC֊ݷ@(*Nq^ ; *T&(۱[dhA5H_5d5DuX "y/ÑēSZI@иTa.,# :Z"THqnlp.j#|9@!譐ģ_؞Pe>A*L烋 ['%f/K$iX֚iVwED3pY`[~3x7xWZO?3<;4jjO?w֙*ȑ#)>dɒvK,?¤ӪU+9C&Jcx^^"NWY]]mT4d?yHNիKOߛFA~~<F"<=+sG3)̿x<[/b1j'O}{ƍ{uYRM7+'L ߵ{$iK!Mĝ;vxʶ[1[F!p4ORR3c&i< 5 S/DŽXܬMڄOК4p!DJAHG}m} J"7QWr(:Xh pCh öhK}0y鋤p{ Bw:ޮb]?S6VPCK)lG:CxUԾoH3XE/$v:6WW`_{oaqrh5j`U.Xg s_R=V)*4xpKvUGg!*vXc8Zƻ,fIxqrGEXKpdB B(4Ix/liQ٦c=BRG&}'|tKoK.{[*ٶu3< Z>ē >ufE>쒥K{p~䈑?0飜 !i6(*"TU FV,hzذawyqc_8Kꥆsɤiaܹӻz~>Ypo~,rrIӦe[|GDde Nb00B!EbXѲz ϘP@*uUo,Q'D` 2&z KڳLVA*;E{|dGA<0v(G:%kי7\Z\tļ~%kd@Qb3Bg9)ƏN]sQt*J{9\l.*$cɤg~`_yeѿۺYY7nnذ!/8|7(j4uf"<797tŗ\K/=䓔+£GR/JNˉ'-[uhK۷mmڬI~A*t~~An)UU\| srhѢ-?SO='Wq-[hip ?ܴi.]i3&L B_}ܗ>l H$??b[;>x(;„-)aJ]QVs8LNqu\UjD)SQ52"*l <`,޺qhg#He7yT HjT@Y82 r'?G2m 5\@mȔs'u0j߉ gwqLĬ1.b?&H$Z?{מym۶ŷꬋ43Sr$̶<7\tхf2yeQjΞ=smذaRVYvPZZZZZ )3֫wZ^Y]o_4UUW\CNy>lwy3Yծ];$k]wp zKϞ=ޜ7gߚӴiW^ywޓ&NޭWڵZUn >|ڴi׬>^9J<%3le]{u oh+_]Zf,7FhD,岍[ 4G %3FE7]kW8/"x,,7GUD_vqSs}˔JٞRz1KExX8PQϭ<j jxA‹18b_,/Ba◷z"9 R)yZGZgN$a7m^t!aذ7\4s:9Ax_|ɥ . ,_Ӛ}vH4;'KXW^yyy*kMm_~٩SO>)!YK4yL2I=#Ydl$%6AkxְēP0c Hy(˩{9D'.c6cXk%9{9:fòʝ}t mꋭsU!MF#"X[ Raֵ("vJ"(-WguMW3OE| Ե<"PYfJ( 2)g] *q.wz Ch&ӺeJv.A7`>o!¬$68b s|dpc/7}B|sck -.wkdb}[VKnk81g+U&E Lubh֡٣Yץ0_Y"ʼnq2x<FJK;!c N>-[fE֠jvڽf}n(߱&/4 ; ovbc}ՓwgM̡PVL6D51q'p8ZL<,1جtJb *TJMb.ťUFP؟():pX^eSЊFk]x)5'-[xB*kĝ'O]T ,ʢe5h; ʗrk_e3"MYT>-aUκnxΗhps+L{O>3fh$z yj jkcUUR%?9yEk҃5tA;jJB ˺z2NX }/{eFWxbvuJR)dE+fPQb}$h[@6X \UOs^0ҝJrT9NOy(۠ ;r譭$<Z._@ÊKT߬dԝJ_$)MZ%6ΰ>Eh`q-Q ilTG4CKi!5Ї#is=7̺T0 E٣Y׭0E^Y"Ɍ$@VVVf0┣vwGgY>ꦖn\zRGNwب2(.x$ϊAT kX:i#p+Ϯ'( + "5zc}p_`d|-<hjTrUκnPNX[u X,++++++? ?XrO݊t0\pa :dPY;11|)V 1 rZLPY$NXX .mT`pzGدobNBi\v爈I96 H?NJЏ)t AbDʇ20_GoM[H*?wH^)S▿t<g荲 QY3g8_~\Doڃh/pgmf" &(oZK:`(ZwcH$1RRS 8n_o7d4֬;(Y)8wVd ug*g]'¤LRZSSSSSsZC4T3YRC::S{Ԙ sIx\*TpP.=( B3Dϥ bTQ{%"326| %O,EyĈU|hWNW誒R|8%dXF;KZBI VV(N) ca+#QS**)07,W$kBbIM<[$ȆP_, 6CQЃ$-e#jZQN&Wk$)o&& תk#,ȠNQ]i06C|  p8a:*'K'=C8FLSf)ˊY o)P{d{2 Hq/ɰ}DJS<Ům QZMq^̒VIcHDq͓gМcBPDxaF)̢H@tX8`3|Ylóh}Z;P NڢONP kbR;88Y..4;Xze[dI(YH&8jsP8L$@_eǍγSp1by{蟻JH&,?09Bċ@4÷9hzlĐҵd2RV!Z!~|˳̲(XʒUG$$[Lxdy+{6Y  (7$^yocSÏ\딋Jܲ2x\C^5dY? @uE|J6ݸ [ 9lN!v|'QZSRR ِ.r}P$(S!9W ̉čjyfeR ,A*!k;< U&^W(P3tbhsR[ox%w@EF=)PS`c#bɤrˈ?RǤ= A`]k:@ `֘V>qHQ:vfT=b *33)$yj@4&SQv:d *V+SZUmatpM}\]:FZKN9 (IvQf0ߣ H zCqC?FōɸRPشTw*c??ݷիQU8Z_Eu*KM ȣğ;E}JQ;&\(] bxZI&d(.繃*HHZAV/dd 8l«/d,9uaK ejm bEU2\Ӓ!7+u'lcZ[K"Lvۭg(.ʛ\ Ş,U?R'n婧Z9L$DEn*4[n'dKꊘu >/b9 _Ωw>ruPN:u1RcM$A&n\3o%wT)P9@׉?? Ks ︢CG̦)mJx(J(tDPO-vxgUd< @\rx F?nvIG+ӖJfYkqjP erv9v޽{uwTb+gxkk]/&:+F;v "Kfʺwpj"7@cxڝr饗`Cy)'cYСu_/d⚑f$iqNrǜg3wLCU1"pg~c9r>: IA h@% Ѫ_QjhD.ĥ`AЌ@TO"5Yl2a "kMD'DQ)}~Izu'♦ pP&'V&Nܩo/(zŊ{o\:Wd&uX.&_P{{ygIEĀVf%;m(45o40a$I*~1{Aa{SԤIs5;+)sfE]R(+M-ft}LmKUų[jo]^^!sʨ-UTy}! @ǚBnvvPCV aqnKWsTH X5J3&77S~a5Fh U{j)#FrVXquG"n]=Vz,1cz^u]3fb1+] ~?gٳiSXzҹSZکԩcbXdׯ_'LPYYпk.\rɺukyPmcر}D"!o޲y̘1={ҥu_W^^n-ȅ|2t.]:ޛ@ǎV6o1czѵK뮻v֯߿?vvd2Ѓ۷[Ǐr;th׿~yv.Zne:ogu"'TDsqyX<.l| 7tֵsiMyyKkg<ۧO.]:Oc کS٣{ݦM]v9l)=s֯[L&|^zu\:[*+-aɓ'u\ګislWe뮻k.:tlihy ]e-H۝\ɣZK5XL-e֖ON* x`_jOZ6JQI@ޑf/+@g=p_LU' 㠊BȊAQgEG 8㰔=zӝV33T.`@2A9r?l裏ܹ?m۷=c)˯{w۳{?V˗]bg Es}vկ߇YYY=Z/ uw͘ӵa`A@M6=z|p.!1c_qG}wqΚe<a/⊕+(+W+W\*;f̘˯?𣏎?my/^ ŋ ۴mϮ^?$+;tztK/>ӧ b#HqX^mZѽǫ/L62_#.\'wqf6_?3{yQ~x]޻ᄋm~O*(|b gmN;6n8;;nڵZRz1s_{&~=zDy|ˢExI&5h0iҤw/w=iEEEŷO֡C/__$:tPt޼7nrG&Mrss6vX7Ԟ=[ou…;`@7:YP'=?$TTggF@ӒzUHK3*^s),RI]jA6i=6يܢQ'n'#NiԨi`޽= ))))//OYUQF-vbXsΡCy\XXh=dgg'Ia /虧mXμxkTWW[֒~gϞOO0_3-x=3駟N6Rs FUaAAUTcCc?0&Hqqo/3g7W|ٲ|` 7i7={()iIIɞ={ACݻRsѢEӧ ܹso~{g]8ؽ{wIIҼe_}u^z5UM)*Ĺ1*4|g\-Nձy84a:^$AE%R~~dDة]CQȾm}UOWfΨqٸJxs;&UDӥ^ `C*MHj "ZO 'Cz_N ^N>mݺe˖PVV֠Ap&;;ۇk۶m+**򮧮H;c16lKs7n\I@ BȈ#.pÆqƎ7޽ի<_Yڵ{GM\iS~z?&ƎmzW^UUկ~u*O-o ! 6|W,%ڍb AwĕWr.\c6~zϯ<Ԟc9mZ\\L@qqqYY5|[ʊi{&P kM7eÆ y e[BtmN?w>򪪪ztb2WDE T!x łCvFZ%Mv X0B~EŕjhӏRDL#YGSē R߽;R xCB̟҂KUt4?ho/b}gN:D+g͚U^^^^^>kXm۶}jjjvyUw}{[~8ȻC$73㷿xƌ[lN$v u"ih{Gxbmmm4++;+ZVe]3x'nذ!LRL$2ymV٬֭egLf :7͛7dP‹/dilN&ׯ0ac5LX()nh$ru=fMmm4++''l%-fڻ|oY3g8Ȳd{S^>s=:to1o޼CZK.>u?oׯmmm8p̙3ۻgϞ3g::ʊn-2uꝀ֡J2cUjYhA{g?TiQl_l~Ewh'<(S&wֹ4x%nj v&JP 刍~M h]_ճT@@ƍAЪ?ʉ/7Ztnz 舓c62s%?㧝vڠ_~ֽZ7a:A7s+}ڴi봑#GWչsСC_~ 7]!1jԨ]\}={4iYgY'rr>㏛3z1z.9ۙgqm㡇{+G^9lإ[s>}UvԨQVY+gD"HݲFܵW]գ{I&uY-2߾"oT0p ٽ뮻^]GK;cEue{n7xՑoh@?QFcnC)=O=5=zXs.F֭ >,śn3<7{t3gڵȑ#v ϝ?01v<u^e~KWj!,$wq=]eBngڵr(=%'D)`7@%J~Y3}RXow4S#rz(ABᐣrΈ#n.'D0 " v};bŊxJJHtUоԋUV^ OZp2x6=HACPHFD\x)QHqC.:+Ӡ-MdC}6'xV?2Dq$ݪ޵AG^F Ar(ctY~.oLנwp x)"ѓXɬJ)ykƏnAӴNKuHc Y^YAJꈶ68S-f/d{_܂H(%K>$ozyzZ71"?rO"~t0@cReY[tTa,TLNt)^O[_ʬ[Yi{2y\H}Ţ/(c ~ qaؽuabs E{!N]jKFJ[<ٹjx R͸Z~LВ#*}Ѫ]28IVrtQGS8BE8Ptkb@O82<9qFeEb?-)t*RGƕRL9]9Ez$&:2nLrDh$g0DnySAZD9|eͩccA$4ʦn~T.&G]4aD¦ipdW4;ր¥Eȶ3 n\)k MA,<6+=R=mp:8VVmUR\:K5MZH79MEBB@  |U~m%XTɡ J S 흯憍CHl6ZQnBy`QJh)a?:CM㶰jN)I.aM ` ?f!`}Fk(YO@0 PN@#x RqF6R)9%r1hR\I}Q 0D0@$B8 tqP"*U@؅ϸrAB0ZILE3b nTwJ4V[Ra"8JH> 9-fE9ZH&áQtS-=Q=Rmz!}xX%H |X29jD x b~9nUTLzh)CDm?k'⏗Y8?ѤxeS9-BQ3juZ{|՗ҩ s7V\/T HƫIa?Caͣ6*N~It67+RRr2 #G3q,Z[&yv yܧ:&ϟE4N*OhǺTH?g%uHp;t+E*\{k].w㖠 oB2\4>ZG-x-f)(@9G È(@eYU~O%c6JDe sMٴx]J>b3~ԏSt4.A7溄MM<;b'|)"xp9E$wM0>-(un7 Hp /Rc617 HKurP_m͌(v L$&C?18;.8 $5޹?Qv @L e'%<~ܠ2XFH|ISӈK0&?` d"H][:M8M'U?%}{VxtSX6xQcqv_?h+W=RQ5;M) ϟpxy|(իp6mHz"tO>&{? &mݧ(iI(tPJ+U"xS o_"{ǥPu`ۓ6jЯm֭gsN`7ǎ$ٹ?f{%/h޷CS@х/|bǚ! i!5=+Rʭ!ݰ"%ݩG,Tҫ* Z:֊q?U5n ?H%-I@n&#C)P5wH,_7ɍ#n]Q"(ͽ_Y~B`p^/I'ZTx삅zB4Tt7}T.vDՃKQXʍǣZVFҷ+Y}Fﰜ[/2{6TP@G3qcoy&╕&@͉';\B[q^N8p g H)]d[gDe蚚5kV~P0L&y 'EQJ{k6 jjjq oغsk"(_ܬYN;@V~VV^ ?K=HBԎַ-LGfT՚Iױyw0-W\\0@[Jʳ-jqYHq:ə)b9 xe%8m[0۹X | t #^Z3)aضƯJdg'mܹYw^zM.]x&?n]C/QCuzIݺϖ|uVHwypk{v٢q &ԲPw?&KXʜָ0H;Y%Di}2xO̢/ gMʑ D ~ NhI O0 ?W{pܾ} /D877'QJi޼yy7 {c‘+2d߬zJ^hV`Alg{wsşw4?{cU-US I%v [(iѢ߿fT۹˗/cii)ѢE[o~Exk?`T71QAT|Ʈz$ec0՟]P]RT׫OJM IN2ت[(X ~Q*]/]P7n@NvN:Ė-[~wȒK6i]Ksss<eeevjW񌅅`B)mXP%,قn["F EOnۧL;vy睻cǎ'xq7K0|p|/+)*QSE~ XM:2 ;X9# E_O(ɩ"33PM@)ŅM3WVƬ~ĖɤiK49H$ lGO6b55 D)ݼys6m:kWm[0N8x4B֭]sxmنpV5~q6^;a-ǕiоsF-Ul3+}^6-ȤϙR]U.,,ܽgךkOq'+B۶mwW|z䑇w֣G~ .[9gձc￯m6t \rqv{9_}UT瞛g?=Owͨ<랼/=f&- FxcmEZh"xi]J~ ڔFwt RYolQʹP@儌}6rr"990aw3l:[{8=bލքD<4ҭ[ wѡC{עShVt׮{ǍװMv/ 9s -]뮝4q',\d wyFryoJa„ _>// Zgoޯ=zΜ9fjִـ4Rǐ{D?)Jr̐gd"ʯ_?^ɇC.5M:>x/UZHNȵ-a˶w߽?n^?}U<Сe]ְ8Je?R(p()Z 3AP{ h| *qH$ZUU UUU;e*j9cL6l%e 3 wx/ƍuСw͘@׬Y3iI&mwPJ:m}m69?sLRiȓ7Q=L PpNzӑtnpfIrzkNpTZ!QfC@ d@4 %K6tűq/ܐp?d a#{9/.*n͚9ZlYTTT^p+nA)dB8 xnHPT(DH8PZFǾ}#L&ԥK9ώ}̙l.]߸ώD˿jm䵕f5*4(2z7掟6Eo1E]zDf͚?ēXlZC?oI-Bsy,g͚M}.--}b_{I'Q ssϽ!0ͷ{:5)}:ᨀ,iOm~ (|r`4N#BHb. ՄPn}hkɷ0>vDDben\˯޵0d"٩s-ZlP:6?p('r̢ޡ{u #ٱҨW4njLmLJ|9O>rΜ5f2+=55զ0 ( /rcOheS/ א0HON{S h~0Ix<%ߺukA~~6VYY٢EA&b8?;wOxd$ʎ#aM;#1:~Ls_2NCFx?\钴Zywarn11WvJ]v"H$vd( K)P@4a5HVxXTB(8kkMtuL Iy_b6lPXРw0ׯ?jԕ{?hPfwq$}[_lYUx4ʊ#aYU/J@ֈW&'fn}lf$l᠜(";!oDѷErTg@P@Sr! ڶ)_eTeCnCZ&bB f@ko(pPn@+lrC󳳢;vб\0$pzzӣ}<}4,OTc9IVk?^mF>ʠ:}lfPHx᳊3:h^BDw[IIa^r (R PJv1 G)dA2 (D `RH!Dh/ MO=ͻ᜜p4k׮܃U]nۺ&??~|'o mubBxM^"oOV/{`;\ƘaeG>8[q4#C9ea9v.Ba^:A!cG/P@R6o7~-ᬃ-z>c,oōŗKoXOvnu޹4iⳕvg=q+^|W2IHQ~uQP?ɌH0JJJYiFG@pǖy#L,1Y5]'Tz2QAoP@#rأIn4n559wָq*l%++k۶͚5=cc՛wWBn89 S  (iɎhLG#\#վjXt8haXe[&e!/,lB18?kq*PXHKo.]zB&;H}}erWWDǐnG6`@OpÆKK ڃɵTS.b{յ |&N~5U:m*>95G/ rYy{C  @&YXXXXX[O x_ =MXvgAn߾ͭÁhP3h֯;vѢ 7'۷oW`XϞ=#nqttTcnnl)S&7|>;;;78۫@Rm&++C[Oꫯlz5apu5ax=뤤' geeM8[~ĉG+*.q\}?ӡHs􏴎nv wV(z!h1BںJ'!QU% XyЦ⵾"K$&_O>w]emIdٜЅ͏;FT~/\x|r J}ܜgI:tׯ,]ݻ>\xC|Ν>(D"H, &&%|`0SRSi4RTT+LYQFx1cFYJÇSSyʅ¿> Q'Ot";;{0U梹F7KQX Ccm9JH2DDQI%T@nB嫼ڿб#icn0 C\5@" pR~<fϩ:{t۶mƟO:~|o؃T*5kB8ϟ?oL|Ls!I$@>X,f?5, >xط__n|>uXA/Z+y&Mx+WRI"fLN2}v$'Y")x`UӮJt] "`2x pw`n.Zȭ=zP5n۶]"sS"=STBQ[U?ޅ_rf@.>8Z7!ݧ,,,/[H$OOOnkX99״|nBԴ{-߿U32 پ-r̘uw0GC Qoz5gl5,PHjc.Z?Ѕ5k'[juvv6Fh|Pi-&=# \{+&0@ JD *r(n?.S_24J&leկ(ˌ}źs $Kp39*rzY7R( 0BY'gnݶn Z"X-:kn ׮_>l؍7C%Yfϝ;ǻg`gѲxH$ ^-P(~6q[wN^^ɪ>:uZ"tpsKOOWlv`PJS,;?($24<*Hߐx7a[;(~POosXF_4u߸-8lҎ;~; jV?OrH$[gpv׶Ж \ P -rh@#p1z" *;^1FZ%s fr|D PpW-}i~~>tXh[lݴieͿ YvMmerw痖R(oz6klll7WC| 9;ATuϞ=z޲e Xam/!, $G@$_Q_g2P\pDv 7@ 0^1:,wvP8J88]ŸD@Z;;C4ck./o3gz{yjVJCrrssdrqRR&03-u7.pqˡt2SB2)H%d-[S7_Q*qW۷Op+lcm=:jh PKS?ոMW}⥥Kkiw:SOIU:ܿw5 =mHH Y-}Tg5t{ R p}$[c֮rWBx`aXdIb8[SO\ 6XjE@4]޼ɣ`V`e6\r{nA.$0 XL`>u|bRS- cQ=QnӡC5k{UXX 449y>^`vivtGxs;[d`W/uze4(Im`ɓ; u7wfcP1 |2?n~3-&Tl,ײFQjOI8#.KK "2̡_8w)s?⣷Sx{L&гg@Ϟ"d2YFFưT`Jra=4:!~=댌D{^ޛ zt7wܲ2mc=5r/^ڡ_⟶[I1I(8a)(d ӀF* h&`B|3nrs517cҷY`;|.kjC6!>Mbw>mFUTTtqqqPPOOS>F'36[nh7i&wI]ϫs@5tHV{*+) .}#6D /Çvة-XxKHɓϟ'TJJ uЫ23U! XL!$ PH@Uʖ{\#qAw77:Ի7DZ3g̠3g̈}مxZ ;cR_]]?')@"|^f*M\+(?qN.L3Ik9hBxyxv1sf~~eW_TKH}[oXL!~IJ9n~"ݲ(Zs v(({)]_7v eBP=xnLo.۷p[rhĜ8y f̘lٲQF_;pF'gW^;v숶 k׮577iӧ>rhr N/Zh!2⒒2ƍurB-"~.qő HTᗣ%8 H$ mT9<oy@P^N\sgc# ?gϜm[tTvK}/{xpӺI+"߅k$SWWvt3c---=rhE.^0D'--CC ^ mڴ1`Uu^{]P@Ѓ  `,@)@"_2pXzh"*lJċإ,r9 R@N@6L $5 ^RPwMt:,{ X0u~Y2_NJJ\J8:ţ/JP=Q[O(nzAn CP={w߾bjtطoffUWۯGh,P d)H)@X"1% Lr(p853'99ye˖8lll|ǜI 3CP(m'wF;~ E~|ҬK,i!PcNSSSbx}=zh)`P %,'|g{U@~Kv8x`~ܙ9Ji)' 鸣BB܃9%V%*;+մ"ɭ߾m׶-[YZիJol6rlkøzZlي+zmff*xyy8x@TƮ_~8\DK^ |yztU^Д4p)H EGeԑ\y|vz{۫-ޫW'N,^zսSP(9\yܙNQ]Vg}W+W)s G~<#>@`D]ii9.ںu`DCP@yիWnڴS6mڵs%K\inݺݧpŋ999 >m󟪪O葚/MILH a(L$ 9r *ԃāL Lnڋ-,֧{h~e j0. ͥ^Q 8p(_4$# B]VKK;v;vlmwС}7V}*%%KkT0 0fL&+<~fv`XA h88اk///>S{z=GFP IwXwf$;x3$d  V8[rtH˩N7mڤRSTHՕ{֭f IDATdh|8`'NÆ Ѩ9gϙ]ЈVuN^Nj.@UR2L$%(U)sD J0!f3^#ڦ mOLApIƭѹ7r! }_5id;}+㧓'J-[E9gΜݺ{P[oM?޳ra\)F56]K;v{d/_W!]kMzZ:6td/re緗Ba.ExgJR( =%˞W{9VJKJ5%Fs}ڡO~n]${E }ߣU%DfS *ŋ798`f~; |S0pF'};,f*}| ߤ<==隣yt4 ]QASשཱིl's\]A+V~'(%_Tj[i;s2(( 9[nMf( EBXLrEnX@tT```lK :+[ .s,HU<ٔX¥+#aVT|J{!Ie} JLnDc?#@^CBfҤ3ցӃ09sg@#QᛊI J5GEZm{|RU5-s}pz##0 0ĄJJ$Щq7##Idk|"AjN9N8p Ëe66fMovMKK駓Mv RRyb#fl ^T /${ 4PYs|%K>`mmSPXh\vuu՘&u]0H?$I46$r2y@0?tCɨsGۨKS [E #t:]}v۵30-"'OZQQfOtHPtd믪Tt(K76<:a=vƬ3fZ"2gX598ɝL:uVs1B󌍍EVVqК&mKcx@*=U[5]k х8J_y+ دÒ%KDGefڿe> &`9R`'*V[ZLs}sƍ]; q#F|Ïf^j ISWHrܺv""EF𰄄'^\8r|m$Im9<oysײu@w3} ATlZAICQ^Η/L.GuF~u%Kv=x_< CmiַLWLħ3FuvjtINN5ž3 HhŧxiQ=z8|NM !**<8s9 RiM'pHA Qr B=:Ys?LBIj"JllڴxJH{ ?tDׯQ*qU*|ġʦL:BPڷks3fuwSٴE߸q/ q!l1\b@ EᲧh2lySo7LQfGǎ )++hSrrrotq1N o/tN[a#a]p9t]mڠ޽85%nYs`M՞O)-үm޴Mէ1٪+6mGSSrwrnU -@ > O+CmUN¯],~Td2t:JRP(r\.d婩eWG ;;;}LT c]b_Vo|Č`Fk"999b&nݎ9 †0x c҄x痣T*UDwR$Tpllll)d0t:] |ba}5urv5?={bx;yy/_Ro2L%sA|'Ӈ&GEEk2$=<K7n|qWo9 }{Zn5G'SiȖx{?OI1?OrPYql133# B"b B^WfNNF|:U`{fv۹sׅ ~{w6{u[}CE2]8m&[sJ'$0bV=/)//qR _~ҥ˒%ETRc0 ðmZ#9zJTRa|W=Ν+mM\2L\M dr8.koooccC;,NtFѨT*L"0*5\T fB11Чo>}>MQ#z ܆Ȭ Lcѳd2L&j^͘Avp6<$*;;;bƟ~:#Benqrv J)ȥFF{Я_n&N*))ƝcH))SRnݺjJی@梖ě7yt:L& `Xfff'''L&PT BP GGiǭ)S@h(--d0DG;4q0 N +,$,|<4<䋐/tvv>e)k'fMM:uЅ ۉP(ԩa0h@ X39iܜK/L4tSqIeў+V_ԔٳfEFn}Щe/⍅oL⣏S JT!0 0 `cDL*x1|0%8>|ذIM! 2دfH'޼ ]ڳG~]͛[VZZ?8ޯo֭ˤulKde߭ۊ+D5GW3zRH$B}!ɄuŅzL&I$+2LD~oP]͍o- daSLkkk w+kkM>ڡ)C fϙF/Xヘg1"Gsrrso\vڵYfA9t蠻Nݛb}|`͛dl޴1b:4edx;s "vXѮ];2ܤ\sQ>ÃA' P>|Z)) x7nܸ~zAal'O vOx#F:u*7n$CCCÇ<|k׮%K.ݺu*anǎKKK;0x*h. 8ZjB!0 JRTP쫪<.` #<|x0 ֯[;g&ÿ 6 ޛ\;w:tȉǶڪ+!Kΰ19磧ީ(xx}5e+V [MX?e˗X}80qRE< &'?u'1˪/γϤe[@b.IMbP]aݺ}Lc̘ѵ 5}_?$vmM'k n iZ5.\hecbk %{!W( Ey͛6ݸq]w1sL.jH~~]F=dP ׽iƏa~~gѽիPHhxt*r1 dRH(% pC& 㞞>>>$ S 8CmgϞ={L2QL:}aa^^^-[QA8 x~՗4-[ђGa!,:D(I8K.%QرcرcT- su]2Ǽ_@)еp[ ==[ヴB_ՋbXN:9::9L.˝/^laa!˅rQeot-[Qo\`+[Ej]VK2 FW|}iHA 􉣣c^DFcww޽{iӆJqy„ 'O& %%''*I?sJ suPoI-mc| IDAT@ⴴcǎ.38zp@iƖ4+agg׷OPJRӓQT*‚BH$B.7Ȉj4,̕wXJUc=)KDm%$!?ú{:DNcK{dt GMAKd2$ĉ,-Gel ( "'Dzax"))ãC/^6 ~>ujY/^28p@5G/qd B HC.@K65DiS&NT*ׄ71{nI}&jA->scGE"W#F͛6{Ц aIwILJ0̿[7gggc˥{T-5Ge];-Ew 0nXB>cٳ<|ɭVqZN Ń:ʕz-/_ [ո>~{K$77Ӧvuum:*d5_b@ t̍7 gϙ ʻ,c e4(@T5vc]GvZeee݉$ݻwv^m|3y >}:}ڴӧ~>qجY3[C@8 CuyO+@*֫tp [ljkMxxw܌,ƬyT%$7 L >/ a1*dh@ ðҬׯ_>rD$vx}w-Ƌ찖Y0"^nܸQT%3z̬3L ~111>kN\BZ2FKUUUbRқ7yo߾U*4mڴ}2*0"7cbСÚ5{*,,\gcDDyyyFfF~^ w\.Ҙomijo$D>_PPY/\GGǭ[pW9 f zðzHPdiŠ̌Lww7o/s3N_reaǏc׬Ykcc;iǏgϙݿ=zr籧3WL@ f6*sZFfW)Äml[p*d@ڲ -/Bgt:Lr0P( ‚J}[tb4E:( R&Ϟm|||nݺutɒ5k"ncvvd%'᪖LZf -Z5 U&=⌌̄P(~ڹsڔuuuxwBZi9)//?y¢"d*Q^EEEAAA۶mL\.O~фFTG,i_.++ҥ˸c8~ðЅ ޏM#k,,% -adKQiqq_PQ!ttl^ 4bX"5&@,))m@ N9C88 B111R8ar<''G x{{SԔnݺZ1|>_(4pvv1++k͚o&M bԔs8uZP9&ָ0TKQII^xxx~X,-((HLJ N֮,gK.@qqqVVrΈ}8?-8 dt* JRPkX2<55^2 u@zzZIIH$3aΝ}>+*:zAAA&z:~E8ثWg* PRp!b-̄[mi^̔d#Gpwwk؂TbbҎ;\.0?hy : C"H$^Z;r ޽JPqX,f2d2g8]@Bb*PEhVmo+Qq޸ZGk먣k:TB 2LdHrw?! B_Jw%77Ν;:sʔ ܵsgwFJyyyT]sl ϫcɒ%:wh"3bffbbppnjseKu7ւ1|FG,KRDFV(JR$VXeY6;;;44x{ɼ+љIF xyyuԩka&sgu9l%~"`Be@>>uKQwss󊋋ry``ัc U+B)$KR4M;r"""HԮ]9sj ̙3zhOk<##Cqۄ32.nקY6+8m@NNA4M,KP(tuuH$B0Lyyw5**;Rd 50؈` y/JB)㥨|RϠ;t`4]s 4 5EPۿΜ_}u\\\WסfΜMIxJq0]\\(i b%HE"M/G[ݻsl)}uwP ׷f|8R _>p8KQEEE [Z^C' R:&䚣doL6nܸ={3ۗ5o~o˺uh"WWWdBHUB}arsyw ˖- #cEP?e9%Iyް,r/}Ez_VV6tA40jltӡCP___;(H?HgRTJlcCArCDHYwz [q6224IלZNkRw`PЋ7L >Y~A77UWmڴi޼yH1VGt-6Zzu>\/b/.]_H1M>ϲJ8Z Yq***Z-<\In y9ݪǽ{5 7oj11Yi& 8|Rn uӱ R6n*..z>4M72%@(SϖL/B]+u3g"=;P\ɴӇ SS###;w~Rswwq;wa0UA$I4(h(.K4>V(U.KHRT cA>ݪrp٦:aDUKz]Yъ O@ hٲeD۶N ;a#w@n9r[Խ8p < b_PPre֭[x<~͛#Vߡ`0悖A: 2jV èj,Gբ UA6c*~KVB) YъR OO@9w___gn#F 5B AQQQԼ@аn]FDR΀kse2dȒ%Kfdgtךk@,w^lY~}EFֺ9cZjYRRcp]e} iK.hj}8fVjXXsmLS0Z|Ij]B '75YkNTrvnj7fLeq#Z^^uO,[VY8##1'BHAZzBKTHA ÄmVRi56WqE!i!MC7KۥJ-%^hNKZ:]iB@JT*mW5\sاa'[NuN9A5jQF=zhǬns8c;<<[=PXZZZVV|t*f8G ѣGb@4Jl2L#п9j:9KQƴ P(֮[tZNmE4k(p^U5OiiUu@ѺJ"Dz'OlC ]2ܼܚ5h,fg̥(Dc]={@ʍ:(Ti}dh9: WWN;~I[ÇQ6֮i:00T*h4*UyYiojNg~F`q6\B4)ž={8zvBI`-!͛71+p޽Jx<ۇ@QaaEEzSW tTYo)`R1-Haw@.,,w_`0+ݵKVTTx0DVݹ\T*%I(H0mBy3L^&IRYB4)>aam۶r 0-[tr0#Hb_}8H$ ir+(֮RTO9wfͦm&'$dd\hmVGhްqӡC[B4)g8~H$ 4]vFɾkU$ 6uJ׮]RT .7XtI=E&mݲyMiK,AE~ƍǏEm ׯ?q &'/~E[pdlMjjj *N#6۬Xܾ}oڼyer͛뙞 BA(Mmg$'NghDJϥ;nF}]YOܹscƎK2z5k֬=|> 'J X6+ދ-w^```="Æ KJ{ ?vFYE`0zVO@16&pQ{#GSRR{|ls=|T*gΔ76)΅1=zgj.Ib˲4@HpWN.]>_Pl/o/_ɓ&'E"޳X`0$ɉK$~8hL-P>yҬY3dOk93qFI}+ PtbTzIWWƴ U+s.Ӧ@B;>>>/2DB!+*,笜Ww 5- XJO`0zAdppE4XM&qwwBpHjiJ 4˫1-HՊ_=o|M19w):2i&r XGicǎr8>`0M넅5:vӱSP(l߾}Vq.>9sh^`1cjr|>jxxu_W6 ~8s{nV @塀4>M49ux۶mst4p.VZ,]|}W5r8XܹSęC͞=411 8kL64q,pzX#= s ]xE"֯_g93պjѢŋƙfFŰ0 S3894MoiZ P yiP@qqɭ[oݺ&< 3f.L}yAPE!yR\oh4 M@$IRT*r܇s _~%oo/̍5h|ز'sppXW`[cCrAܹs li` 确~d($%9rFE qKJJ(R(U.KHRTcgϦ - \T4,/r֭[g@ƵM7_ 4w4RC :wۖ-J6B bq?}^|rbb"sy ZbsY1 VQV"3 _c߿򲕄RQ (-7kQVh糺`QT/cy + h/HqraZ]\\\eVq欙3fرkYyyMnw^//sԩbq IDAT]ϵm|?͚Ւc4P|||J%0* WTT 2fYiSe2 1yzE]HPf\|XCRP_ğ!@v= Ki\ڬӯK`M%dN*S+M].U r=->]\\\>Щ> srr!,]lΜY>>9ٻ>t5N0w<ҦM.eq麭[nEvھo5ࠪ;vLU%%%nnn?i9uPV@Ǻ0+t邒#k7eTU67;Um|2@p%2[x^'#V%'Kώ1ݠAU{8i Uݱc!r\//\Z4 ZB*ze&,,m۶*J8 ZVs\ ΊRYJRk+@ @\= 𭼸p ҄i_kbtY'ι ST*_hq.0k.˯nۺ>;u X.,NZNu9cztޣ{wEoF=zh];AFŏ_󰺏0 8ӆE}R!Au488nBaiiiYYAT RzPV+F-A :b]JK]nɹw"r' @dn7ܜ",\: ҿO0hv=ɉxo<~XD۶qz|}|~;?rZek֬]0ueKN>Z l: ,Dku\.o{֚RT@77 T(toPN|EeLC{^zʗT{)P%@{ZAefKx[;s" Ǐ@;q#UhBdiiii2[`堌g48ۢ!q#Nj##1s,//t;کc/^"Iu!M(~*IRFRBh6x=|$p8ypĈ-C5t>`/lr/>\pQZZ_}Օ+wԹ97D\+X$,`/^`ӯ^Eo!cB;ut ܻw@R<߿}!!!nnnPTXXQQy? 0$ q =|Q RJuh9e07HHb)N{z?.*J*.䦖eor w`O'.@"ja*΀pwwwXf-Is-Pgc%Խ_af$$jܾ}[hHH^fĈA7;ozg{0%==}}O65:\X +h9``cw.odYQQ$ ZrwwrR$ID"!0Nu)DC4-QR[.8B$ρ5uBV(/P0 d;E ! 狋G`P$vذ;vXPJدocǏO:vm„Ս@ӆ_֭[AZ;ub>-M^_ÇWOW6X. *Xbp4e-iH$WF#P8*r+(h.2Ų ~Ū̙c#2<<'LfZo&;ɲ@V>O[eL4aPhYuʽ3W'P\S<^NfK”Ç;{zDiV'44422~ݻW&߰a9_3n߾=ax.j+d2p^柙c~"0k4wޠ[r*?}wN3KvW;zί` ,B 0ؖTBT65ٹz"S`%gWq貲C;w%{z1qՄ2@*^xoe Ci4aW_A=pMNu.[oqZ64q,[zhٲ嬙0fEE9wMZacn݌|fzm)F~e֭˗-5{Γ'OPsd PE˱LI0, `%q ˲,[+裭 I$|;4~߲P|!)l<:?u b..SYMC ~V;@$zg"<+/*-upu=N%Cy+_y{J򲷜6`)$Ge&hPLr4Jx9T KСpAh4OƔu>tUyd@vjLQQ=xfOSJo7c,i(&WaY 8X` ,ʰ@5[{CDEIpO!.խHtԩ/>$Y"!bMMX {`WU|`,Xq8-nn .@Dllx**:7 +W' u9(I787ra7i9 ,1`Y`eUv84M߻w'ŏ%i?aeij7gqt-aD_I2$(B"F!X.,OJc%G$-uk+tap97oN<1 @*M6PQ*ZiX}ph^ָemV_'L}g֐#kLC˅=4,urWz=+ Ʊ N"⨽fϝ@^QT̢(ZSSn߾]XXe=խK*[#=_#GdwU ,ZEKN~90q$,/@Y /д-G0S^QRTEjmd&`r7R{T$ ЖNnn͛Y11B , T~9$2 8_\Ӥ0 KrhC8 4, ZR_o߾PPP0eJF۶nNYVx<ڣIILu 泍A,F굴QK t-7kQVhg-WUsU$eB X.$YBIW?q4D'Nʖ K*=q7Ml*'M[o6o^ef[e%LYjyz)ø= $Xmf G$wyJB/mbXy]YOHWo> WpK70`Mh, k>&I\ q XNûySeRDw>6iqqe[nf v;ǟy8a+""N^'rss|M~V6/[I()Zt)@yy<8*>Jji OЯV , +Xqa%q< rINo ֢;w}s萋KqqIf@&=).RfV5[hQlѣ :AQҍ5vP,^֩3ȤЌas%|>*Qp pT|TpN ïv:C}i_!$A`p\X!.X` Z5&CӒRB*֮YmS\.>}RXcP(yP...VQ5XD`~[o4[x. BqAL|w(+a4jT Hhj'33&g4'D'zVv˅~9v`T-...Cj@ٳFlDZ\\kק߾˟=mvkѢ5uCDdJ- gfRɫ$05#QTq;*HTYp@& >  E y{i_oTE䀲QQtuuur1X.A.`0&ΙoLN0X4C"o Bv])TC(ɿ؏73INBk9 ^pT3<fKH(߿|@{I=EEE vup͖.%(!:>x@3N@璹gE)sȫP !Kҡ-*4@O %=h9YP͹S鞪徆_(R)y9H-$"@@ R fCK;Cd c"X`0%5q+L WOij50!,Пz2;wwRMr` ޝ)s\ioDV(sP0P+ZMd |i03(Ż}Qp&50K <8 %?]dEa1Tcu,&p\`-XtV `!bq ܠua¢~ʊ~=Qd0'OCt3(| W'Hii:gyP:4,!TȠ d޲[ŤGFˋ 갉Y+mު^XU67fA/_]Vjf:0أ$DiTu,abq SwDgǏFĮ!Cv;شi.7k^^!C^ d=|u༹stL ǎzz7%>94L<y8ُұ1@&"[M H 5KFͽǿv BL~ QqaBrQ+VZ/bؖ`,+]޷#^fȐ!Ѻ'Nj>yyy/\ ة?h4cDzUk|RsG{/nB8||3lK˅M.`,kI0G>߳ghi:%K$:vqmҥ$Y>=,{MM`~M94? ~9`^ە}{yݏ>`[OUO!+ڵǎjUXXXVV-f^'=ztʕI~&xEN9FQOux\c+]˅K.`LL=VĘ?Hr}ڱcvﮨ]JVԹ ΝOjys.^:ͥK͛k8wfz=Λ;;CZ/Ydڵ^y>V- M5qk (J3<|.SB~b ַܭ:AO5\XhӦܤ$:];&3ѯ&v=ڮ˅ɅJc|9,4\CLӆ$i"V\zrn  @WiXfJJVRIQ#_gzUdiE)EE͋{omU 2Ecq}j}`I4'C.JܹeAu uV-'軙ښYŬ9rT~?,`kC-RsVU5>>>R W_T*|...țeuw/^xpsd'(\葼st -)y|JI3sqZAbFзO&hS$Io/ ߧN޴isvv/8oN;~w6nw%//orBBF۶nʬž>qiEO}M]a_+.,Q_`Y.JV4]ZZަZV(PbP🙙b+3 RH {`WWlFwDm_BoE.f֓'E 8KorRMc|0۶mkcǦ$LIO#%ܾ_ΞMHr5^6o^ef+No/WQ7gFk[@ZDڌيY)[2l!**u唔>\V?yRM ccjT*y+JkR8*0%EERNʦHס@QF~V7;[f!& ,X 0  X⭲*e/??`jם;uںulذj5IΠ*{܌!lZC[JPx@_ S?7le \ˆ+P+ary fyxȋit7W"fUccBo!JAjCpg*" `IJJ^EJ>(`shy,?{/!K7[aq9`Ex5j9,PTbX`06E]QAQ-Y^Oj=ӎIݟ IDATLm"LIkîGAH kVSO'Š7;Ld!oٲɬ9 PKNݿnX|*S$ Fu۞Xb.U%df˚-@rQ%:Њ/\hЦad2L!у[xw揀TV,џ=~[7n毼 g?3oō0LU&2h!IU˖_h䫃GN^PҥːNCDiY^xJV) Z2#IL b8uVt\ԛ˅>hŊ"+Fc0FQXĻ}[AduѹYl0dQmmVl~֭=hsIfpt;DEEO9IIsqfѷǏCCBm&M:MDDm۶9\tipгAWbFN ):7GhohX.O=`0Fe EN'O n5+L ӿsEU^l~K%0[L*8JߙuƸOVd1Ywb~z)I'M-իW={H  'ɓ  ?I%ÆŚ3SO0@? Xa0iIF C)$'n_ʈEUTT=Fnb۠e3b ZJ33)ݺu?yxh+ŴxyX1p1v1nɤ)UᔬU>I{p]hEȳk@^h"sra-#Xa-}pT`lRT̙3Z@=K$?(*焂Z7D E/[au1IggLc:cҙ&*2;[YV3 ӄ*dL,/18ZS.k9 ,D  \50Rpׇ޽*W541?NIN^udߕ1}\E"4-[T*nݶcrJV,dLэ{3Bٳcb + oYԂœlGXwAD/ qsm-[]_2HIJO?-[؎tIҋFA 7oΘׯ c],Vral9˗ϟ1Zwuهs@.'|AV{ooA*v}֬nnnPPP|ٲ/T*777_zDۄ |?|Թ;ۤԜp_v?HvÇ=܄uEk?RIX ݻ[u/lܸ~߻Zm~!H<<5ΏJZn=X b0RAqzVn[;w*c /**\ha=Xv}t#3SѮUW .?eNbO>1muf͚u7oΝe&7{6Huꎴp,6lkcź4'iX?a9sd2YLLLuVp(;btpj麺"E]DD˖-m4@ȗ/_k cZ c\zv]j֬];;wT:m8_7E"kN>>m<ܹsKкuku{復Ǖ+W.7t#OͿa]wgS,Tsᱱ_~^7vl &<|'O9r?fI bPu]3޼#Gܪn'Nd6m޼yT&0aBF6C vg\ EiY222VY{!5u츱|C._2e#GZJ!C޽x9Y.]nݺu_?k4]d>-7/{˖͟} &E&gR |K7lLQ3n-XSj׊*JPE;LVgQ9 ]]ِk`"E1˂my]Hs]rsso/) "Q!Gwرcѵ: 71?yrH$ڵ+ܿ0Yx<vL (l9N#'88H.(kƊ4-Sib% cccO8~X+oOM>d͡MxxTd7_3,@ݻw/~-5ͦM۠A ޘ?GZoXݙ)d$$Lӻw7={7"ڶi."T+);uyOxaAPj˟lRtO<*paٲ \nTKcǍ|ژOݣ fl>5u]u?M _HM򫯦MV< J5HOP?%$ɷzKx|2ZoY.J^a9b[5[ }Q ? EnnnnnG))"I&&TSz wMsCs^ܭ[-,,+ X.\vwDrҥ.]4i ϝYQ[dз__رcGYYYYY7| Gƍ4͍dIw-Z<?JHoʀiS޾};$$W^.2XX,V՛6mӮM?Z ^ZŞ/`p,Hn_}YQQq/9N܈5۟HK{cwzg1cܰa} .??*>Ց>y5ɾ9; ̸W:uԩߝM9LQt)ꏛ73zb"#q*לӧNo۶qq#$Lę3.\g1G\ VA\qM^TnURA 9ZJR>grCd`pwwn0UHn]~s0!!!oS?m߾*9.?wݫzc𑣨%b}xۏ?Qs-[TYso,йS[04_~+ X.jIzZ 5sݸqDv/O%>iԮ˝0a.&ǯ.,ؤ#574@j)ڿk@N;wl'lnL w}-<.wڴiӦMy/5ˈ#F"F9~ UI4uo[vM`ѣGy\z~cQV "'.EQ?=;}?|Ց𰸎t¹shvꀀڷW!u5ZU3g$L|ϱcɂgQ\^Hb2rq9'LXx\r?6th'`Eu8\  V,] 96QZV֫#]3d|$(qQ{tU2Ղ$ Ioou dgsxg^'nvl l*X`0"$$䍾ڴx۶nys.^:ͥK͛k]K$-Zn|ĥKZu}U67T9_<?jt kdY^;l8da'N䗃`;wtniaQ>Λ4irB6mm3|ltU Dܢ"#O><9IIsqfn^^^Æ 7n,8d  c!h:0BX<7 @cr$r+V ,W mJߟZ22;z.˅\`-qu >3h4 u@ \KS˅\`-Uz W/~zAA†r@Yv`" `0r@VS1'yyU[hLJDEF@nn*EtraEl!# `%wݍ,!-w^hAخ)[r@V*7쐎yra-l$X`0fE*DP0/ 8( `?@.Aֻf9 55mAra-l$X`0f*lLLiTSYޭ۞EE=zL޼[WGϫ^ 䂂#=#;ZH._1 Dҥo5nM۴\ $<)*ʿk ka#Z1GK sHPJJ9uxmgRpT*~VAcCw=F d,vra+1LmAi//M` Wb0T R4C]fÇw|L8Q"/\Nl 7;jNKP{F dakc; c.Ph|80;HpHhX߿N.]tEQZ;AjY5̘1,A`? `0:уζLrd߽v5}q0e*H( PTXhUl G4cF᫋aSZP~ 2;f6BpԨQ ȖPR!ǂfU%`S@Þs:蚃T.`#c +RRhj ];x_~_oSLd=r +OrQOKW6X.M`0uCգ/ dpũii.o`|={Viiibb" 8p֬[vh=Z}<` @*f s@njYs˅Z.Ba&qƌqǙI6m߸aYa0hB(/$PTݺImQ$H~UdzR;$Y*% Ll.2riRZ ˰\C˙93qZ.1qƫ:xXn]xQvL}hۦ ٲ ?vtZWqqv ;wPofƾJZnHDD٢h#mҦbn)VUQ{oKu [df™i 13~?s9z<**ZC:t]'m5" SY rrr@߾Ç CNNN]ńdWN 4ϟ?_`?Vַþ#ϰ75JD!I=1 uuBb0X\8Դ@غv^@B~9YSIV֌3oⰹvZiI q^RkW 믫V~PrrsGt;\'˗66ot֭v#G3o[Ţ"#Qbdẋ7֝ ;x#a!+++O*hrg Y9QE2#C*Jo$2y??2>/: 'gΞ唜>sfi5c*47Xahx:$[[#i˖-ff[lmjjbrqk+&&6mjnnbwǛ:ubi5d̘܎rܑ#y\eeeΫ1o߾]ntYYYs b ; ɣ`?EDV2MM fddǏ\pFK8?CW/ f)\r/ZjSLOO(//4TGwSyy9?vnXY[::-FW#1g!3QL[yykȽ-j/a,X0zjj]]=񱮮zjǴS_=244 rrs~kvNDGE*+^rjYyYLt4ؿ}7bc ?Sŋnܨ G{_ܽ+%%Olk5K.r]iiiIՔe\8޾}lmm;tVQQG &[jD\J8?CW?JsK>oٚz-5&&e˖@&&&rsLLLv[{%440(+q`%:E,55>+-+~!BVjkkٵ"!I%K\xnݼ9a: 00J>555heeeT\YY9hÆOS)W-p%B(++v?+4IFFȑG4*ۅs7А88Ӱ7ZrI&$CCUTTjjjlݲuI/N2yyyooOd?}#//M%;mv: inlU6)Y#))iia!-#/ws\~?# z hڍS^πMZ/jeK,q8c`Aԩ=z(aWWW P]];Կ ޿NϦrY8"HKK/Z|hxxJ*hkjj~ގnW TTT9kV``!㏜ۈYgsm?mۈfigBwvI=uu?٦@VZeK(|@ RݡuٵsǒOǟz&rU3NY}jkkC>tuupA#_(*AnHq㺾AegϜ626lQYYݻwyii)DءZ3!oO>}K̅uq]2wtp%%%PrA> IDAT&{?=}۶mrlبQ=Wx?qyVN2s֒;N;ϰ;Ct<Jeftxs&"KN+ aeݺQ_FFD[9 H,^z}p<_|A >vqq9u2xpCxdd3x:m]w5{vӫ=w3gܱnϞ=p޼y[lymKKWx;#>xW>sNssSeeeNj%fgjhhhhh >lcHpC#111ٱ#Ms60L*)es)vi]k/TKII1L& s^+6x G(p]>V" F{97qŒ%֯D^FBBBZJ?343XC>wmo//K1xWv@U-w/  @L׹2H!4'hf}T5x[eee8mmm:t-P AC}o j%VBޭt|^pu@ ]G__!:J‚K.= 1 ׳ﵵ%+0_/]ĵ~ySӹoLWa/'M|.+++ 0hΝ&/9op2aY3{éL権R 4@ F z''ːxRdd\G6eiӏzzA^^/_wd9ssa M-N,99Zf-};ٻ ۞?s|:B73'LfЛ54k&ldݮ9]lA8|_Dr!<. c7mVmh"HNB|LNJe.>n62zz|o5qK^5. 6_ G'ri$#ӉW3deeSRR0 0JJ `\M!4-33SCSk?~Lk6˕}ގ8&>{Khd<2>4|˯a g8t{2q\s/شAD/p"~- 03[rYٳgȟ;:QTTww޽sXj޳Cmw (IS'O8^XX!-u>o!^k6oX0W-j 2ra~"R}! ։@ z\^EΜ9 8N"\] )Νbb::'L{;d5k&X[Zb[8l)SoN(lNdap: ]]]7+M[D'h,@zzz#GLKKKqckLvssrJxGYi5N䒕0ߤݸUуE_ׯ[;F\\3}IIɞ{Qssq&۷+++}>;'ðؘK.766XOZZZn׮Oqno1#n7)/&&z;wjWr}dǏ##"^zѣ,YjfnF$8s޽{d2z(:VKkńPWW7?ntĄ};mL*{ak2#gbVwA&555C6n3fLgN…$$%,XxsMڒS]=2uwK' <8::X}JJRR28~vOfyدv<tN(##Q=QgoBpc9Cj;\r_K߹{;زeˌ3ѣyyy~pIIɈ"ttt=zDC.'b;Nk RU.<|711qݜu|le5իpfkk+*UQ'O̴4)::< y/#xjg͞}@C{׎Sa166Ç..*5;Ɛ`b_!CMxRKvvvC i?;#pb{R;y7!P^^gϞ^|yرrrrk222ٗ\I!6\|yCpڵkof͞@$NHH5{VWkii9u$XYY"m(&&F"FþfZ=== 3޽{}|edd*hfdؒdRIIe˖@bEv^Z򽼼dddUpAE?L[rD'::.0hP.^LXM8WSݷO{yEGJrGǹG⎬[f?}SD/~xF#:&Z\\*++̞ 8X,"}tTT =Бa’PTT9kV``Wsf"de%PSÙQJmX.-TUUS]_beFF9|WV2TVV~ k= jkk%$$IL%G xF'P/Woo/b@WGZ`vsuuC~5/!0P"d钹 8[X644@ssS`@`pTUUO9H //oi9>J2Ǐ'bu! X,Lntp^:&ð&&]1(Ì'755͘1TTQQtlvt^Z333KKK555`v@Dr$%%WZŖ|QBRRRR4,,mng}ܖ/{YrÇטVZZnaa=|GC/^߿Ě@4w' PuAgx_[[ZZ ,, W !$$$e3CKKp` Mܵ8/rr\ɢ pAm!:I}fZ B4Ar{։@ ÷{ ޠBt@m}r-.j!!HP[-;X@  A < ֒ ˿EB4 ݁rBAj4@ ED'X|*! X,j4@ ZT"HAm!HGT  +@ DY9@ z&A |[ SHӹ$-ðc&zm˗½Lhc3-鉉Μ%+NR}xMeMeqVPSuu$p )\JYNST ", [@V.jjjL&ێVΙ3gL e$N@BBxGvmmOxǏ z*_`dnz?TU0 PҀ >?h5kJRT/j|gظb?326mť"r(**RT_ [Va=rt7=֮[5j/wzȑ#_̏_H, _Կ$)K)ihbk{q,oDA555.n^;lkcY@Vt:N)"0IAAAtL ݮ`oi /_(.W{PCCÇ Gr/SeShRF^E91QY[S@ڝϯy$$$nڼd"# x,// ۖ矵6vnS`@[`2L&s<5jNKIIIIIq s=2qrss+**Oap}{v4(0(hԨ6~-oH,e2Y'O)_ݩ߼dzW7ūWWxz&S:1!!'7ߟ2ɓ'mn+Oׯ{*s}Nj"wHX]a+<\֭[-,- P֎@ 8a0 CIISz ðwZY[q&C&M]fbJ aFPZ0 {jhj'OY,)Fwŋ -47@LLNWRʎ i42$9DAA.;'VN@@@;gtdIIӧOwpf*c"ގc^ *έ[qZH c֭KOo 篨87yWUUBah/5p)DF/#`.8 AbԐkPƻ&K&H=R"=ү 0JMtCq G&2&TM$gRLFJ ÇV\zבk|}Mǒ%K@SSs]3eLtְm /LwӧGM۩]# +'7'Ò0f1?yua{ ֡Ceee(?ʧOrvo7`7[굫$ pn?="'!CxIKKOW^ZZ<==.]*@ ظ/ff[EEE+ E;zl,]y.?uji\ZuLt2\/؛ _ U9 _*[?U*^zZ/; }JG$!!qqښkTuzUVN~>\AAAAgG}YRZ%?vXދ.}dDDRγ ?}3}ttte%-%+Wbbbttt=zD$x𡂢PvJfs ~p_322̝#))}|X` ONIVVVYYĉ9FTWb^p` IDAT:|׈SNE2x2c{ì=jmd O#4mntl=`eGc,#42]I7lVSS]f͛P\\~=((PYYYEEyÆ ׯ_Yf'$& g͚~lRRR4_B `ffz$.NUUI*#aIIzzzFd tԩSr:`v/Ěތ_ۂ59̽na Ut^F2JvjK(og41{aU4cէO-[N?~D```||<TVVΙ3pgXĬ;Kr @0#kť?C7ond6߿gU:@iӆ'O\]\8{\j|GHHHPJ|tʦe 6p ck3X͐1HIf \41i3i7#]]l&v=[=A$WRW^mnnN|TUU=}tg߽֕{7h (--%&--'_xK+yyZZZ:x.N0L3/Fd9ΙõE?ѣLSTT|mTՆa3?6y &ŝm75S &z<rw533n*= Q#=<<Ǎa _ٵGEUyӧOӷ!7n\sKssKرc;^򪕫45"v QLqMQTN aΝ5jdkɘ1ܢ͛7\\_۷0aVn3+kVֹ44&Lw޹{ n;Lokii)hhj>wx(ͺ=[=q 9Z,^U9̣ϊ7L:xhc3xh:f̘~y'F6cDrx@"/_|r.l%$%lٺeV@"^HɜP۩B`(((ڹ0 qFS>9L`qnfӧOOdX.n>k._9rhzzzUU5ܿ&oVV֙3f̘fڄbccc'*Ў,C*4V ,YEbHxQ|4wh89XAgC|j 1aX^ 3{Qfi]#;< D[tĩYBBbԩMg֬Yjj_n];wtWkg10ȑΟilL"ϝ?l ''/^B2NsHՇ&K0lgΦIߠ͡N||* yyN ׍Ύ7=v#k@ z oCCQkkkOşr0.GVRRz捣1ؽ{TQ:hck+(ڧX[TC;F*Ee2?-"hpme}j6?ӑ6mNbw ړ@@TUUWZe\NJٳfKKKO+--,"#BL1&ƍ jtt]`mE(@13K_"@ 1`Xwey~["+WR/]r_Ѐ-0,!11%%eU(;L6~ƍl DhBwzmur3]CsNvAȈ΁ ouuuK Kx{'''SSS]|JJJbbcs✫}xiKf!0 0LBBv:*UȈuM-  Eb%%{F  r(*0<׭1ÁSH8/^شa'deeeQM붠evì+c҆Q_!O:o3V88ηķ#:Ɛ`/oFF#bbbxJ9)MۿQV^N0̯'Ŏ?n\VVֿ;v~ vOIg ɗ~ ,@d"A :GpLcogǵ@] ']b8 xeGFXm@|X!dddn C\z=\aSs[xUapܖU GSWڹY bb )RE:+daw9z츫 B!Cg^)C )R {r^fiiill,lEzD[:MCZ xb"""TSk#M+~|id/]IөۑhAX9A.3::*.ӧO:Do֭ۧO=Z &ʕ8\µ+M MDb]*)  ޽{)yݓ'me*zzÈsA 0L&S"r1PPi|ﻗw+ΟC݁.o 0tZZYVpo5nڽ AX9NNNg9)9sB0aqもgN2eȑ#yhll1<39rݻǎy!888@eeȑ#i4Wiiɚ5kLLƮ򪮦0@  ;wǼGyyy7߁Dp:--G޽|^F6ʙ?o^Zzc]]];v؋ݺuKRR22"%Y0x1ܹ{G\\޽{G۷oo>Us lЄ|}ݺD=:" E s‚60tjj 8cABNI) -BFVjcc9TBb$%*5)rІ jjjk֮yv*Uuqe\r c ⼸,~7ܽ{yݻwǖxر&rrr>xyIf=/.f' X/40P:EtVǂO  r:BL:KaXAAѣ_ZtN\mѢKMd&WWsgDZ98duBhd,>kEGE|p5 Ìe?}™kϞ V^ /y&F0(##CWW۫J+ 0 #6<11v\m~Q~[iҪuu5lPXIzh(rCc,B!rp @E=eV @CCd2uHk0jxZjSLOO(//4TGwSyy9O AEEŵk^ț:u&Naaᖭ[OPEOZmEDD$>k bY -,)I!^P "D>X9O^BG:z'uKwׯ?x`ѣG@LttQ\髪@FZZZJ ޿JRcb?]l/ibb,7dΝ<% Ν;gioozxmm !0i- TTVLfXPYY ɡ6u{w7M&h4Ul J~477=zٹxUTV/AS)J[{LMMْ֍u(zggb4!hd9OSS[WG(}9j׋B 'UUP\TXV^~!2~:ٻwUTPP`}}?8Ι*_[?UUUt!y]~~қ6zyCN}8%b4ٳaR !H0@ 5UdTtCCÚ5]T\AAB477󙟷[%U&%?茶h*!* A SNquqNP:=ϱsF+ p``]ݢ*akA G۷=---`0EEE *R[ ƍz5 `F/h   IDATZRAVu޼y8gGBEEÇxzz۷;*B~L?c2>eeeAG[[[ q|`;[u+/^8{ӧw0,88$$$Jvw"K6s8N łih AV3f̐MII0 ð+))222 ,/_>yDOOoСYYY/_ji]xҤqcsuu a%%%ݖ'&^@d2Dt e*uTtP&d2̻u[0m/@ Yٳg9s6#3pK,VTT3g*++;zaYge[XXi^E3y:x0,+ a&chjjvwzzz 9˲e\hQ8o 7ϩkMF<ђ`L. أᛕ8a*@tqqq " X9/Zt٤dq IIfD˗7lUTכ,-,֭[ghh )*:"Fڭ[L8p$pus8tӧ`%wjܯ_?%8H/ oMMMEyhF&XW\;v =zt%%eFgprss7suq133VpڵrOCS(d% l )SRRtX,}-QKzRφ/D  z?!De>L^^N떝-777B/ .|ٳghpNQIHHL0aPp;i}}=an~bƐbkcHP"mѧV-#CFc_+*{T`թC CSSۻ(ߙ岻rDMEAx4{.I:RĻ JIbieiSZj5M: BQHS 3?Fu/,|ޯkgyfg3󌏏oP׮7oط1qqqqqq9__~~ZR!!!IIM" }V%7n$%'EGGmټk׮9Bɠs洱mP(N:),O29:iSfIIIXXXZڢcc͝sJCCVv+D㪫TuViX6 Zqn螢ڷo?MLmq&Yel.N4hPAgdiRᇓ۶mi{#;CmٲBS~"+l;8Bz[N @XM9@t[1h-+d&]854Mu8A_ki ¹hsB Q8'D9sB Q8'D9sjx .@g JZ[RZV.R(o$T*+ˢq*_LQId2ekjk]\;ptF.]qwww@F9ſ&͚e˦XF9!(pNr9!(pNVmllMkZU"0 crXj8uiXR,+2$iF9ZV]8=[` /rݥD"1Xk6ʩ~-նs ,hrݺ]򫷷ZQqտTuHK4󽼼XǪF9FGHK[4bH":qn8-QWsע(d!!DtҿoDؠ;0,,LfL3H۶mcǏG$'')xE=nNL|ٳWJ!{Μ=sჇ{i|KӖm[=t<܏g|wO~ʩi{=vX~R n޽niݿ $$$$$$ χmzhS.lb8pqZ._?ܹѱ(|\&]sr̛إK`.)}ox͔om[=䤤+uwamxX[oC_;A>~ ԫ ^~9 ٚ&k56l2xpȹsԈs4+Xט. sUxXGw9<䓅|C/QxXnmK.K$$$$$Ovܵs'q۱c׮]4#P:{C?^^^)ne2aC.mkr3b{+i+W8pĉ2te&[$J|IJ5/_$8x`T$駟.YkP\?_EG5|^ކ t 6 3-[4(0P&&&&n-,6)hڵ"׿^#3fxM%F1ͽA/Dֽ;ߴP^^.,߹s{r=ܹcn_|…PdΜ9pMBBrӓjjk=<< *1ly z,Zr,߃d/0 GeroMY˃ ݺZx1 c\ԭ2y]u"0y]ODR[5K.S*+髯ego;vlZZZ[| >cwkֳgO"~횿U???]yc oHUDZf[o+!CB~~hha%~l|l#=?""s Ø\?h߿=#׮tgϞ{= -}^]VJ g(#cMBY1a!'X:NEŝWW~bxq ^K6 8Ҏ;6lؐcG;WSOgfny[237=3ul>}4A[sO8quUUUUk׮9rxkM.?1~5kJRXg,YzF8e<ʍPۅ}vZ}e˗ ]\HHHHH"566X2&^z^bECC~/'O{|ܸٳg )s\ѱcqΙcQ#G͛7K b7n4.ӷo߻ }Qaaq[֮]KDƏ;wN.uʔ߮\ S:i$~su+ߒm۴`n[i\'Nvڸq*#VXaA_Μٳ-]6rHO^xmӦߺ}wHȋ/|مD2f#SGh88FԘ\%w}9Dr%7WW+4 Fq)n@[]tHWaF.{ E>- T|||||[\Wn֜=߽{77Kr$B:tPdddHn%@k]p OPHsޗ#J?vn$@yzzvҥkP0Q˲^^^~T*JU$>_02L*)p@ Øo wt(\!R$D9Fs%tH2,*:՝XOICANIDAT`*J&U.,WOgT*Տŷ=cuuaU#HnjL&K&Qk%1Qݺ@g2R$@!˷PTu]ƥuq=ٛ7ڻtQ7]xxIV$q$WIENDB`knc105/doc/cs/psetting-cs.png0000644000175000017500000017416011436654001014276 0ustar dandanPNG  IHDRv pHYs&cu"tEXtDescriptionT?da okna: knutclientPX tEXtNzevNastaven UPS ? KNutClient05 IDATx]wE3]v%,Ȃb3`ypݙ0g@Q=P3z^󌠞JP ""(ay't~wvAA~W^z{f_Xq MY2iJSҔ4T10| .Hf{Fצ6dDR!)eMU$rY[XR C)UWϓ¦g!Bq/յdE7?2Aaa4G:5u?!L{қ7ߵmA^A-얙4l5A(ۍ+${U=j]7xeh{NU(lRW&tB' n H(l o\+e҈Ig:$*L# jACYobF}^p/ЈN%(U8gHu̽ Z6*gRSV8b2!T%zF\Qj4GQU4R#(ǫNqxp$'F J'ird :u zmUh*8dU Zhmn@+iܹGH,+iUUD< $:*ܑi# cpE^KvTJP񂖁p1Ba64^?V{EwBZTGU5Ė#S0AImABUV.9^ЮՎup']WC1TKϡϰaN}+-}%ɫ KyЀK!,_OH2ܝL&\!r+U5Ȳ,duUe"B!2]!&*1,1h+N_E eYmWWW% w># [:hm,Jo=]vJ5UE5DMvUSSS_ߐ]PPض]l۶BXVYG> C d 6@|AlGgS>Qb=# +lE"{, Q,a4SU~F8>8}1j%M03N@=S ---Y$(UYQex!a_{eyct!iB)P꠷Eʼ)`6E"g6 ;lT[8[ q$2cAH=!<@6bo_BB_yKT;itˈ7}#ۂlofQp p'cGŪU|s۵O& V (_{n׶mJ%pxǎ ݻmL^3A1vbJ/ BvX~իmd8w-!N"[v ڵk[nǎ[׻uK|rC۶C6~5kֶ*iUV6]v-*++naK~s׎׵k7@LnI^ubkJd)^)hBCM*ObÛjզZ%5*R/8dOB#%;eJ(q բ+^UF5bl@ŃG`o:X(@a P!3( DxDHy^:|bT6&5FESԼk(W뇯^Q* rR Vr&x(߲?oۮeqqee-?|j6JP(o?|Qqݻnݲ ֭2!- }!EQQJEHnJ(Bol lB#@"G#=V)yx^<  /_n#G?`@a⢢> EAaqQ$\jIĮXbPMFefT" {F}:7#?~ʔk+pG{^lCY'*%v&6~>8btx`wڥ3|JiΝ bv@*)frV1ykA[QxR(X؋W2"(¸1ki{zjMQÆᇬGUB;3PJ}G9NGzm,KvVZ94(QgYӝ2@z-˪\u>~dvۺuk6m=t__NAaV%%"e(*..*.P KJJlSjR((lURL&m$8WѻbHVD",c2,`Nnbo@ftݺk֬u饥m#^;w|yc7lXɄٰ}zhs9[؅x f}۷,PsܻB"J!CDSB) :u!ճWBճG=Oك}Q7p}MM Z^^~_ګW#4ӕ17RzHn=.us^={,|ݺҽG ݺu޽iľuҵKga&|֭^{Gս[KǍh}58pK !Nd lԪ|@ydiB`al"e(ʕݻҥk7XEZqѫV}qA7eիW/^#0zjHLᩡt&3Jqw`_Y6HBUqp>O1A[m=D2sƍszH,!o6HKF.:N IZYgW5U NuS`WU1U{($~ Y! Y{ EjqrEd @E,  CzWoȅ$|1FOaQStHkBw 'υDޭ{׮ݾ_)S^r%둇~d#FII6mYhbGBlJXY +aŎ!˪޺uǟ|ů O;tg#ڌO>s-+3Zq߽]R:p\8dȐ}bժL֢Ek&1K(Æo/^\Т'xgnR\Tt_|%@ݫв.]74z_~痩S$7oޛod24CgDYa_{m+{Cz?C#{ݻwn]aеkXBm߾tG2{lġ1{`EmCIIq&LΝ,ڵ3n;ꨣDyNY+ծ0 (SB{H͚FK=&&4)Կ!;ź MZ f0$Jr48ű6wВ|yjGr4RE UܑIwxB!O8DqSN9SQQ^XtĪ?:tŌ,u }#QrsUUGHK3O_|%'M:ڱ4d>9P*hoI ^df+#H&m)L8ŋ1B1VEyϿХK_~H&nvBȵ\}3dȐU>?!CVZ-+_xk׮/QVVoYe=/^H$?‚/Gu7͟{7 ]xEBgy7SLW5Of/ecEN=e (+ުU+ͻ5 &_rی[ȼGY_|o1rHu1虑^߽[WXY3q0=;͙g:yλk֬p8|饿F8ow}~wK,FݨJ݃iC&~K8km2I vcFM$PTyeb>hs *J۟w=#`G ޡ Bb7vMà( RAYa O+t}|VEHUUe4mQvQx;,[E,#ߋNE?|i6i$c=SRRBGt( Y\G=gzggg  #LmZEU- .R:gΜK.[=\Ve ܋ڵZxDi<ͳB!RǶkm]݅wd*hql;&FdR ڿzH_WN޳gh4zi%KXp8lY֎; 8wvhzfdvx83ॿ^{03&^9nxxgNbRvv`M\XSYD2 3n+**ڵkK/?cG >z͎Lb]13p9< K{z QJwȎ 龠,]h\1yJfVE^ .ģwl*o9)SJH,.߻MJّх3QMMDH$JX,w**IGUJXĻp  n 0:ˆ2}Jm]Btm(lºFMSz-%C˖.[|iWs9BɈq^XH}C$#c?<أ!8:,wD2Lc_1l52"V?yC y _%pGQ!v1X;RJeKBHmmM~~>%s~HX!+|,L@Hii!Cd1\uU>!Cm8pnƌwg[nٲwyq Ա׫O///衇8΀6N=m3nO?P(D)mݦ7λEEET8YD(N`ݻwnѢTVV@Aa!nk܆Fy 0LɝNƎmwuM2ΙF~:dAC9fx(mp/x)+{G=*Ҧm͛6-]yCeq#Vvj"Ba71xet{N{KTyGnRO>xLDP95Jx; .Qd\ 5Ja#((L=pW%CJF&<[<7ƸTP~8/?SO`H$&ڍAN>9ycVU_;쳄!`]=&uyP6cǎ=餓 [ڎi)_@V]mM(?_0S}ً-z)ƍ9("!$LoѱA}9~foIǶlMyyIގ0eԵk׈(ns~~~,}ld3:mꔵ#p8̚|~˄%ٳ(<^`g0ƏsweUU]ms`U"v [>xxCuuuus>vgnj+ܹ3g0dPw[O=s]{OEbk|);of}]YxӦ۴ӊgͼ>__WJ ?C)`w͚YUUUW[/`7Lsn>8ڶmv"O&X,PRmmm '|-Jjkjjk_}(Sao_b x<Ic}V1bx9S)Hb+LZ<Ox\$ Co\'D"`D"̕L$_"$DN(L&dOm'maNjL/ڶ-qm aR/ ڸ705f+H0͆6r˵55?' W(N 1ĉ͟? /0 RBHi8[*%[~^SOM}$`oqlM/?eLǶǜ 7om#Ҩ,v|b[ nL$m߾c|#YϥR ?_uIˏ54%"B^ {=xMQ2s]3#ݚ:3<{O !JK~8y<|I'_PJgͺNMԹS5? IDAT~\YڿNXq22m]rss{l/hftѢEG1(##c\x TN2uΜ`Æo}8}7ʖg^E?qR /4V%lhd'MmBd6J8{Oqce țZy. 8{m;&S<%VxDw'DBe +.3rfm;7/-Z0 G G"3X>?_bWJ\]t&}GˏbxZɤHBXL EC}01l& lj^,..c9?–-]er;a{X^ŠmO G"YYY+/_|!CrssQ +>Zq{L$Уφʗ6Msp@*,A7B%v *jŋ飣<T <O{OT7J8_0r*V'b݋&܋Aworsb!i$w܋@\cU/sXhn B*F^P|XPVJԕw!Խf/b +'@[jE(݋uZlM=YI1=87 [~5g&@(_&eC(7GE `y^Ub/Dp8͌._lC3zm00D˖($HϳɅ  UYA NmHFfVĈb+>)1l ~FXM%n6H&vFF~Vz7zݡchFw|aÆwڍsZQ. 85Q# xVqg}DEA1F#; %Ϩ0Pkk0 qB|9p=%NӤH=YL1B(dIz;J|>!@ +#[D؍X˲\?S%f*g͛-GX7pfD~{Yuc6)5D(&qGaX %8îqjyF= &W Yoz}:tF ?VBD"`!wBd'D"WZj7xw;vF3أmX/H!|) <+%<23Q<aQU(>u, (lw5sT gNnn4#bGŻ8[__ܥGUXX!bÆm'W1i\P.@/ϟó߲_E E]ƞtˉ=灶!#/DD68Ri?sDPeJRlUŭ 17D#l7Tj!,#yxvKk!qM2Q=qy|I@_@ӊKuTZ+eQ 7j>JvSI=7&KXksl|pvvv$#պnpo(%E Mk*-PѵLpDR Jb_cNix 56"IQ"><_ΈFh~^~^^>!$H4}SYV$zNͣ<$}_gpd~` ơ a$ɺx9$=oR2\DajbDJ2coҞRBQ끰@ $RR -YG3(%м?yj#Ԅ*bhB[Q.\D ]JLϮשb*#13C#.km@E 5+k\a#O Ԇ/\(S)EXJץ p@~FrXψRɌYnQ+ypL$u`B6Lɰ|6]\ nVRTR$z>q2+GaB8I$Ň/~ ^B)lH8i0qJAr:~NPe;!r$NeDzR/l[lJzQU梀R>%ST Tel8DWz*ħ)MXKVpf\nODkW( 1"\  ض(g|>b;cqJCQR6Tc;HaݘVgF!dd +>Fz8I>5clɰT*|C} tbp>>K߽`rDZ#Ş{*]H2 KO*K5у!4!h\߿/.̀Feճ{e[CH([ ?P~OׄqQZ!Ia1%ápd?>O 7cN 0*bx;Eȗo 5KC(BQ ^r:*{Qә:ވ 8%Vwq((-0 r^!?fPST@EM%1Xūc"&Wi_*%|qhA,=Zf1I[}),QȻQ)щv@PM^p@r]aQ?X۠$YEg#`y]}w^ HH[вm~4pI4y 7&A`HF]N@)x%P) T^iJ D{(*0 .\BOa~ѵnJZCԯafH9<禚LAx)~p"s/ HhDBuPADF! !eӠ54f ؑ0J^Db[TF GXl*`%hi.T'Y@LȠ5`M^Þڼ*+K<рG0*"GSH)C&* $(oS % 5S H(\*2)V" 9ɩfG}HĪ1(& E\g~+$5>>TE27c'g3{Vu1|$ᳱ)5)5]J(W-D K$}LJsiNǸS$&mhJ"iQNf:4 zA?RVaeQ@f݊72֜]~uir}%V0AJ A=qEbO R #E_p3fWmSS2]-F!LW.𓠡/ȾȀX޸pSܲu&In_~FRc7#;ꜞCN jM[7N_ir .oHkU5]*JS@ ,\RRD4rB7'MWE~ R{5Ts @AMOmݮhk ÒBАm Pى1Uk^0P~)0!#MDUw/ S(,.T<(b!k$)(K W΃걧(9ktuL 2r2m/i%oNݥV%)F2?>׸/QE\I|A=a>%5՗3QH&yfMgm 7G{Z E DAh5_n ]fmU Oƣ֭sbe`9~3!d*X+xͱL]SA O8:5T2D+{ÔcJ>")[/Wј7x?MI(b_$K]dta-sĀ19 M\%AKɍ(;NVzxjc⹲-O&"nbutwUHB X1` c-H?f%@, FYE+pKNx@T|0Eˈm~-% ?x;/I9aU< M¼ylrSwo=%WƞѨi5~ %LKV8oaB-`hn4 h"fT`Ոu}Vf?VzU43 ҃ezV'\J[(Q<`d< 䥯: ;uSVЗgJGf@;Jާ)0@^MSv*?'Ūtv =~o ez U`KU+N@''f~\FY};+sj #Ůў^@v=21N @:J^ )}A7R2t(2SdKE &yΘԢtЈ˳LpjxM-ơ%[bSl4o  k4# 9cRŀ{J154=aNjzYǖTmҔ*1GsAKH9cSe@{?c8:kl AY/7JS4F\& %+׺ou@֯N:f=צp+eT$ d~ct s2:1~\臦R|izUV(2 j.M<;~FPֶbC;7R}HKE~km|]qviMRA]r{%2M}!oȣuL(?"2yﴇ!{Ĕs! |Wc!u+spꅐɤi ]K`Yn iГ͠[q %`UNX9v3A_0Ldl $x :9B. abm+)eT3F¯`P}=1V@ؒJқG 59 C?*iJB荑)%VౡV?[VV uX<=my{l g-,g*zH=TX\оJY"_D2"" Q<>2儋Uj d"iQ/ocvة_,SJ)踢-oyyp|8P,'9-\L) P)_?Դi,O17g_pXubcPR^3R9_ 鬱_1O]~#}j}A ("meOR &<8{RU! ~P~!d`*,›d=dq:K PUH'RN4 9 AA) ȀMyḷ@O7㊘t ʹiIҒぎU󦂦J,`pkp 2\^q -&@1٘)j0 ȅXS*iJ\?H[e  -52n!| 諸R"J 7DO>7aǸ 5':aC1.tGZAP>բsYt!XEMu. .OA*@ 8pӻOA(lQUG5Ղ 3* `{T.;6MU jD4B<%d555X C99PRcR-A89s^ʠQz)^ >͍|`*#1!0 K5 YK> J|T?RZUq҅UO18噮4ȜA&O D=TC@ERt8!q4STQO*$(ST Q3b,FcLU( n=? 544|UZtիW\P(->}cG8\ zMC«;>bx(K.x8T,!fdiQ TJ}aBćwb4?"eBvFJ)zN_ o(ZFhؼQ~5<Jpb\-z nH''H Ͳ>4+tui(9,ڧIhH+4@CPPJh~ *S J2'1KR_")LF"fee5DO`'@V)SS~t"*_UPs-t֏y<`  RaHH[(*]5 " lLz]7?`\jS2BڅvQO^˕12! IDATUQAN6ĉCQU4lI3-/ԳU2~<Տݕ)qqv/ɵm{Æ }[({`B9s53go~Z466|uaNJX nwf(k%rkhh8sF9ida矯Pz}Yhi**i744s#G;;f ʰ,+jX $5.o%5ѿX6[D FS֗\Pˀqc/[Cԟ51:c;u۶Jɤqu;VZZ+;t`BlnR[LN~w ;[e>/w,UkTAW$!P޽y֍<?0ϽY']X !M  cm6I݆!*ƭX'P'h ̸0*\NG $)Qyh&E1 #4ex<G"UD" UTT(lurr*ɽɁ eeeڵ س|QC ۟}[^6IڼwQ;/3"9ӻss0]S,jٲeYӧgϞn:Jƍ?x`N)zOLHaaY𫮾:wq]t}fx07,,lp}v-Ew] `YVΝo4HTY>,M #2Rܹ /H)^6 xͲaHSͺkꫯUZ~ Čhg{n-EEE̼jjf(}P$Qӏ6p\VVpTt!(4<9TCեd~ikzGh4D"Җ-[mSJW[ŏo8>]M~7Ah{駟k㎊2&o/Μ5eYYٺuk׮(]ۉD'?_=z}=IkFt鲻g7xq\Jɨѣ.]v=&FΊ;SHg,,(6ld–B.4AM`g=j.{ׯ_M79:Ο?gxI.]v '<,!%+>:s^|G="j+*˖2e/0s̀~YO<Կ`g0RxGbn ;Ô\mog0FIW>EHqbo$V'zdXB܅חψ0*peYeedd0ΎF999w+v]pTQGj&{WCf(ˬIPBVdH^^fߣz:؊D^v1s߭u|"I ւܿG~XfSMճgF$rꩧ;m]]]8B*v?`>izꕑqi1!0jh?A)}D {&fFcnjg}/"++lpf),!+&eee& 3J.Y2zh?BII&oNbR}&VqeD"^x¿?F\pa4#~y<;K,i_aެqcy?QN)X׍17ZRbwe MbI!`(U68Ut!Fj/ G%|M55{]yP Tׅ[ih~fA=%/}gECq~VfƴoI]t[o?9s\vM]]S{7cI?{СCӧ{^HC&L<o'k!a?`[jpx*vѤU+ M4r$tcJJJ^y\!LHD7;֭[lвeK}ve[EE]g<[z_) jրߑcs'.D"0~*y2x7M( /rM#?Q\WW aJi$ B|w9xཫ Po\ҲsFV]۩LB]]Bhٷ ro]oJu~a\x5TTT̙3g!mq p̘1gy_lgϾ1h(XЩ nx<~iݺM7o~EEEoQyb΃<ıA2%erʩ?ocJaQQQѶmvY\\s.m;wpb&ꫮ*u69bLؼ~1 mۦZm۶h蟥1B&PӯѻnE.0MUd AtuMbP8\S]]SS톆۷v!|]tپ}{4̬m{jrXN,d9ty,v١#[G?_% jvԽu[4gk4iukq9s|XUӯW_AGx=nk0 (5jW`ԨQ Ɯ?ުں{&  Q7wɉ54ѣxƨ9|z ^,;^hQ` cƌF3}ˢh~Ǝ/}MYRRrW\|W1Zp… ѣ/3gΚ9΋.Icg}vxٰh4گtܸ^v}-~mӯ&ɪh΢'R}UxT"cVVյ W*dLRӴ׉=Pp8l;NFFqvʰ6&{C;73_?Îlcompꃛ6ʹI]V8e;]y%Uאh"u;w洞o>?W^ao!YgKBn"AO'F~ǟXئvajިAR$8&!X-.&-9SJӏD555d27ﮬduuud2lJO==E ˶f<ltvUK c oz_C(Efz 2h9Tȕ1T0ZT+Uk'kt1)txR&=JC͋KT9&'mSd^4#fv@U@ex?7~DhN8/L+P8^{╵ ryIvM~ҼoΩcG>w @3 9?Th(:/ C◵2517QܘAd_! @UFpUbH!ǿFJe xR}@ċ q#8!l߾m6?Yl$pӎ4U9 Ā6YPUUk{χwjc?kEj4AW/Q̵BA(ণگޥO+駟2nԨiq*9V ۞߀ƵwV%~ ɤJmq?8bԵ-B@>N4Nk׮mժ$ D)?ziGurkv'cĀ6YU/?{wHŒ}B9(Rn:QXJB*lF~a052!1f*5`TJtz8PqM7]^Б$mus8qC<ۯ2`=;.?jd<:qw_^دs%OJݹQ*Ќk,#GSH7j %;~؉yI4LӁGuuuɤ]SSH&Ѽ<L#\[OHU6ͮ'٠~ҁ>қ}>_ڹBh^?8/cwm/e">mp>9M{tOJ= I-$4[ ܰќ5'4di)[ ,qCٍX jImMd`tzC}-<&&I9вثǟަUaM,kjݎe(H,i6.!ŦQ*ν^Ro[R,K$D"c񆆆X<5ضwf~գjl&?7l 6EޟLvk~]#2s3uiw|P +b< c5ҴxXE)M?cȈÑh4egljv*O9dffÑq,vKEC/}^>oFXNĝH˖Y9- uLSҔ4>r~M`o[wW= D2F)uh}m

|>|fp4)MiJ^^lh0`_+4)Mi:e,{ XiJSҔ45<JgiJSҔ4(܋M1K(zMSҔ4bӔ4)MiQ( iJSҔ4(|wkEҔ4)M/-).*).:~qJ 5N8oNSҔ4'?~'|k="ͧ9>UHSҔ4cڿXFk,cռG)).jݪO^ӯ~u҉uбCo"UrY]Ȏڶ^V*++۷kۮm;*(ϝ;hvm;_|薉e[ 24)MiJ/G駯^}7zM?,Zg~+V{^=W`;ĵQHQQ 'zU>xO,**~oGuo6?f̌[o}XnjvwMiJStP;$'?S^y\~V}^[[Nkwɪ3n7v t[n9䓍w֭[‹W_}oݺuc=1hy&,m۶D`FJmۉDb_+4)M?D"P41쏏;QG=cD.d۶my#mc~;a ./{kX?!Pϙ3k&sιPڵoƍ_|gd2jպ(k5~MVVVn߶-"`?Iv ǟ۶ ???͜y'SN۷/{rJ\UUqܩQ!3g%0~nn# -y/6(@ evuuM>}ݻҔ4ݺ}yy,j6Y,O~E#N;Tqn+VBq-7ʯ{{g8?w$@D@ZGΪ8[pT mڪjڪgժUĽed~a|?7ݽ{OvҰa۶={Lv4h%N>)))\`C>?Z5&'7xyuҰVBsTToB)&g&ѣ:dgg[*+B@!>}*gSD[_vŨX5fBOMFXT0"BC,B!T)lݝ<BHOۖ]G1l,2 c.3P(,S!Tk5qe"s4m4Uj/_?G= +++#=M,)lQ.N‹fmDtVvvF :,Hd7o(r!tjΌo?||PS|f?e!k˲FlV-1l`b,)f͚q+$Us> رn:Giٕ֬+Wl/.i:a9SB0^,ΙPoOw+.Ffj7nھcD-[TgV=Z !5 Ąsݾ}=HMbۆMFG겳4>>(J)Snܼɽl֬ {t̀0̗˿VZ͌ͅpflUa6rn۶gϞ-[uѿID:t^Xj(Ƕj-q?xժ\|XLtIE*!~N;Bteu:Ȩ, ,۹KkWukV o+- k˖OY,s̨T#+ Ͱ5x^Ѯ]j9u.]-~ZR5ajFX?~+čBB^6C=k M7oܘťw+yo^!R;b۴i\iVjz[7X,"h7x$o5~Ǎ\1 [ٳgϞ r/\R!䲞 N^H]+{Qd#ï3pӷvT|uu*S7mXW,Lt 'N8q8iIl/㟹˲n^(ŕ !Jd̖MmժUə\|+<.ݽ{W(#2u_??Dn wx]pIܡ6mZB,`m/ R鵄J)HJ/V rs&\_~n͛=Cj(BBnbIau|@ZbRx/FӵxBԚˍQLOWlN r+qS7nl3"uDh;B!P)Ԛ B۵!à@ob4XJKB=Ԛ;حpx& "hFׇco7~JˉB]Ԛ[\-`A|H)B!wSkBlqXȩ'Out"r3bh_[+ g AG` V̲,0%( y<vqfD" y\.(Bs+fDJ6 2Nu[UXA]NaƠחDVgdd(*(B7//0dX2]phȊ0LVVJ4M)-&IVgee1 SůهBI-o0\{A+]!^)|i_bV.J'XFlVO1l`b4Y <9"7o>ù5r/Ǘ*>,UtTm&E uY_vX,~͑5'&>lۮmxVoMy+##C |/vܺMܼWCoܸK=B[]]|>}ls ,B6jb\׮[۹K6Ϸp@OsG'$$p><LJ_^o)yU|~~^^XYvʯ*.sחdڲeKh~9rǎ;z4((hɒ%_틿o} Wvq1X|r/]sǎ˗.Agnܨ3gnݺڎ;3gφT*8w=ǟ_̸ՅOsG6τXg\[ntvwRSS޽;۷~u;T 8eDm6`'?)fvlTJM il^s]qmZZj9\=mN(<zplݵm>lذ ?|-7o܈*/_̯:hΝqqq:Ki"Xb@.^զkKޯ_*pRŝ;.Rs'mݝPUd*1=r %Vyz$^($44444}ۧ~%.Z(vIϷ7n|=c><44{9~V&Lжfѣc*3۷kgi Mk֖8f̘<|xW^ԫWoOOEddd8!TC>?8{h 6yhdZ,g.5Y Mwԩ^o=ab{w0 bKu_`o@$ 0V5<<+Nvؑ0ޭR!jP(OhQ!PMV **###33Z-}DҾ=>߾};xZ!*ȭj K,] C-qÁٽ;55l6_ڵ[e!{sZ…TJծ]q֮z͞=g%n(}(%9bT#F,\ !ŭBP(Οೀ⚈`֭V(B[XT*,2 SBab*=ڃiP(LKME?BUXN4dg7i0^8D" q\.kd;! %dg*q/e٧_S:LJayi -H^^JOϲ!j()nBaƍ z'-L&/;'۩X .xӋp-Z^ Jn\,r˲FlV6/fh45s‡s玲o9׭]nsJܢEh+ۮ*!QZ,me9r ^k03[ T!B5OE-E|ի=%&=ztO?lD6;;@TO]$!Q͑sa X"߇I]=b ¡ÆoSLg7y˯_T_c]v|{Æ"h޼nڰa@ ڷo ì\r׮]z}nn_ JE]㏩))47n\ [d[n z}ys BHL|xgX,tvm?JUxWq㆔dk..?B*c=QaS޿_ݩ+WF >ASL@=;w0q"=s&ysJ>Y1$.n Wo.>//={vM6lXp-OG ᢬zݵk7Õ+WoϞҥKիbcc?»rPK/m߾]TA~PmS:yK-& +񌖊k/ы݇RRlw^w󥞞Jȑ#waisNJQT [޽˽{9sh4Rw=t@~𡏏EQcƌvZNt*JR͚=kOmE"L6cSN"D#j(.ҋ*A~܅;F8q7G??u4o?#"9{6%7Tk[i{7%%eРWeYj?m Xl$???Jzz8]׮^5 P+]ڦ!#lժ_l!!!qe٦Mpnj]g~~aaa"șxyymOu$%%qz1^ 3fFGEЩL*}RJ:PMTJv-"HڃO+JhMu% \Do-RB=!nja 6=Ɩ"4':YaC-\aCo޼+%KhZmƒŋ%L&H$ =J\haq*m| !SbWI3 I+ų FcfO?6m,Ѹ׮];q„ԔI'91cGԪUAz}^EFr .}w}||ƌǁEE*) 1#*aZWפ =lZR $$$Y1I IF̳IFʣUηIV7!h4޾}bػw:#%*ߪ84&Rw7QS$Mw}S\\:4M߾}}X9@ >ݠARMcć\^)B!EOJut<5B3!TuS$f "IT #H@ uDJR(rn~~~nJLLf ҹ~TwfqbB[)%B"BRLU)BXk׮pʭZJNNNLL  P(V\9.UBG>p.&I$_~9;;[$I$.9@(fYaB!Î!TZ0 $$vBϷMmj+4ML&oooq̴THT&B*E%m.2 ja-KX֨j6v>9NJ0Nk$ay RrqBP{Q# g` _.O8GNE݋t>>a z}i MI$^^i%TyBِeޒEա_90YYYjl69yV *FHb{ɓ J(rYUβh4[,Z1 `XFc1>E.]o߾5s9sߪZ.-%Ig ŋsh ;nL] `Y|`xVV2` B!6'9@E?ÖbNex‡~͛7/1sqj7m4{֬? 111-[r]ZvXeo(Z <WKh ׭zmmkkӉts3*t4.ɑ#G>/W|oOо}mNQ }ukuڮmyY,f[͛6ٳeX4ۥKN;nܸKd+vcbbrsKUOrnܸ|[Sj@ئMUWmZ!e 54C3Vd2 ˲,[􃤻Y`ǘHXM0pD885v3WMӋcv-_4l؀Ko|ѣG Z`ϝ۵kiV_|ymf۷o߾d.~HHHض}GD/Y'S]fMFM6]K!X9;Uwζsܻ>y;I#Hԩ9|Y*JR͚=ңJu9s4diU IDATGtt {n.Q*;*g֢EXW?3.qza/tɓ!TCw'H `3X?䩦  ?kC?.sy*6:͝7/&&5k4ȫw/v`ǃCVӟ6{{{֋aZZmiW eq $IJy2C1,XZڵb7nB\9;5]V?@ )U$S|/KLѡT"ueX5KNt0MNttϙvj- VЍXcfż5y/dD"ѣG-rmX6CXxI߾S g%''t%\С.X[7oa~?Ӈ4?l9-ܹsf9S4i8?B6@UZQ- 0V$c%h <oV="c&hZusW1cчFFF.]`¥3{g18`V-_^ի״iE)nSLY싡C,;yd.qqk׮8abJJJppĉ pZU+W;6==]V0`Ԣm3|İU+W]|Y$jz%%~&ڌݛR8ӆJthd9bбVJ[Xb-Vl ͘ ,caL2%'S$MX/@\-P?%Tq/9i{;K۷owx`-g+DbjРNr{BHBQ'.E|a2;XV{wsSAxw -Nw9BTbtZ,x_B^R)e(+ u9WP0̇lYxv,BTT 9jJU ~JR!7S( CBB翕pu4 pE)BٳNsH}E$yuח9 $I*rPV&SL&bG )ՃE*C;x ^5~!(J,.  !TQ\bl[6ZOD\IW+>BGK4YuOoS#LcUV{B9ݝ\ϲ4<9g`H)&fY402o)<ԚWMroV코|&챪ĊRG!? @^Kb+R‹9A[cٻ=|x$|q(Ŷ oG[^c7><'tT[y$uhkTYXէ By嚒bIk{w[F3c=x5IOs7([Bl- B|;@ @gdLX*W~ Db!uxMY°@d|X;*ЖM!ߪB\b;Zqp}ꨤ&{_#aﴆij7R {Cב G/zZ? -˲ ØK @(x;4拡D19 lŽu!D[yn̰I3lU* t9M6eFuY*z4hxj\.vBy5x2˯7qf/]-ձT}:ΧNa z}i MI$^>OʋB $@~o)/߶p"ra*lrfKbR;`ZgΜw9I % B yhM\*gFba߿lYb4 =+!bwq_,Y&M*ɫ@X˖qSN8!T66]NGgF~}_1;S3+&9 %"ߞn曤GI~~~Ĥ /|'\uVˊWlw׭__Aȕ.ki+J UJ@i_B (l2?ZP8 aC'?m~y3ywiڽ{Vrͽ"zlfyG:vرSE}d6m;Y~]uh?o|lOKt֩7mꫯv޶}ٳrs />ںusOz:DqXskס}oXo_!O; _+>x|&#Ό~}~';v*+WfheٹvUeC,e S!]Қhl"">ٯ甮u>VA!eeSS:ؽGOK޵cەRj!!MT*{xig1θ/S|7'L8fh>_ߏ=3?ȅ1&Lh bbY&MB~~wf7\;3:tH9ØÇB38(Vq}Y1O\IeC,e |ݷbKw_cOHS'[*D߮CG5rɓ|Mض}ku5kvgϝ2{{{6322lonsiii6) ,Z"Gowbqgk/_ `& l_Bgʆrcy!vaY`]^e]gD}PTXx^}n: !!!˲MCB1F/]עE HTxCJReKJWzQ``N6m㠄hAdi߮l:8S`ZmKOJJ*UBnrY}gP bj S#}4J^1%n@O3z7mܴyѶP>_?ȭzxɒ 6C]$""VҥZmV$6o\>_yrrN]%2tG%&>i͛1gx]w]Y\D .寤!jgB,NV8e9GQ#nj%X9l<,Z"X",>}ԨnݺK@{{{GNek#TL:Kk[ACۿ_:\رc'NԮCYޭ{>O6M.ݧiږ9 .յ8-n[1#5o9yeC0擭w]2nvwv%Gc0 ;w^`0v겲d2WKs!HPV Ǚ%(?Xb Xސf FVd1Ej$At:ZAQTm%AH(Kj!JB,IxaW7xEb$ M zxx,KGBنbgSq{s7N8?V 9p1eٺ" >%R)0<{ӳqls;.bYg&yu !\'qZsBςSDί,&sHO,bGxM6@!VܡRmS>~A0 ! ,VMf`H$y$% 0\aD"j5._H,2 c HER5B!!V&կ|jK]-6`!y*V+$I B.Ă]0BlOֆpBӴlxzz˲'PoVVVJrH$,t!TkCC1nN΋/6fby{U m@47\J0 Jz}^k0+J4l~U!I^^^>A*"y~!'ijVh5GS$qjCtu2 ci x1VG9;0B!p @T ԃ{²=XnGM)P_w0LVVZ2Ml^o.CEjFE$<!РDӭWDz%_V-˲&`0XVPZ" ˲FlV6o|b/[4ClM튛5kVC֗-[֬y&VŹ!+!( |5 V~:C,ZTITAU͘3+f߾{8$II.\2**j옱~2!b9AEz|4V>u˲z>++d2L&m 0 C4Mӵ$:&E uY_.kP8tПlOO{r)4Mw#C ߼ysDDDVl6/hQN:uGfN֯_ߣ{:_b1_t޽sΛ6mwѾ}Yg+cBy&:l5|]KAxd="`@H.NzKڧ5\p"b1&l6f4} N~YECZYvʯ*.c?trr:ǏѻWܮ]\♳g5kM,x9>~-?\25%׽{OZV=#.ng^ ͷ޾}{֭$9Kǵ Wlr_"hŊ|2 .'/EnhvXn!I7zޢ.Yc</333;;> d4 f@ S|, ,6lݺu[EFFT8״ilo o9d~}yz*L%N<9(8xSK3vlɓ&С߽[ !TBk|ZnqzG _4tz*_~vTlo(֧On8"h/(m̘1|~ttttt}"Iƍ7n\ED*]1Y7 P5$)Hu:ƚiDn;Ѝ$yΝz飨@am[tRNNO7!jgCs;AQH$:J$OO&M.s:Xf$H *R&l.'J 'VIh*LVEf|"B)lS[b|>Id2p|aD"V(͚5H$QjryB:k׮iQ<ɣTMPrebBa9B4ď BappX,H~uC&(jB}B,ϯW3CH$rf6HBPV Ǚ)dbbB>! @P+>ܝiX\/3BU, 0|"Pq'BjXwW!J`0k!P2 ]d6FbRR˹!(*E jt`PD!bnϑWnsj~嗭[ф rrʽ-N_8y$USN]/n@]aC_r:P'@!z4+>ȷg͞駟|@-o駟cnj~gƌΥn( ^زukeCb&''aFRTs }q2Y0 SuB͙l1gkԴt¥?7Z|M}UIň IDATT5NWחa^O[hNjAZFUwB(!0HKKbjiM<ypyݝ]650Yjl6OTb6+"۪urf@!W5 EðիM&U`Q%nMknɓBEޖbh YӧψX/_̞=g]_DEE+6[9r䢅 nE͘3+f߾{Ļvnx7B"v-X@0w޼數)SN:ݗ^K=+.U&E uY_.WVq_~p`4fy';&&F(bO<(HFi0W޳gޠҥܹI-BUg1=kT_Vފ|ʲW~P!0w]w5| ֳ]ݚ_͖ժU)/{<~xU\ի}}۶g]굄-[:tH$}b]ֿ\p 8Y o7ŲO~iSʓ'vlTJM i, l {믿;Px:ǁ(RRbbb]'&fF#HfL~!T%jpC1*'wډN:yڌ|4ӧN?T"ۿ]l~ڗ+Viǭgd5ΧmSSS ,ZV!TsaXXs׮tk׬w/%޺WD_lvmfo>]R%%= )*.]Vғl^ׯ瞼B k/T{M0V)qW#ᔸ;v,PիWҥZVrj@D_,BjK.2d[7o͞3b!ZͫȪUc{J6 I:_*Ӧժ8{Z~S}2th6mnj2䷦?|{n=M&P\{qT|uu*SB{>"E"yzJ(.ZhEѣ!IrرƎu(!0F$wΝzlKx ;wn<^!j< A$!JIf([$@ɹrJ`P`Z.r+V=BZ)L?l4$"ݺpuG! Ud1"Pq0FEys9[ox!$ĮYSYcO<\HBPV FǙ)J,b1B!v͚2V* (&Be!i[?y$WKX,zjI͕JIII~~~z>999((ڵk7nm'>>ʕn1|"PzT X{u; {2!a&lOQQWZg]n"uu+ZG[ZGUUn@vX2Dž! a0{rι9wX,5kZZZjgSTbɓ'mڴIHH!BQ5r IwhJ?U3P(_𨰶1O!zBK(e ȯ>pJg0cb3bSSgA64Q-ZT\U.B,hCj;T:t^*J%7Q)BmeXVd)5{"*/X#R<*gUOnޥ챍Mݬrrs2'4zPbv=<ݶͩIɊ.]jSlϠy<BT*B06d2(5B3YGUXRrBBwAɓ3&LpϞrmIY6x]ÆeliM1-R)+llmBQ332߱l*!3z^Jؼ٪k^lܘ}|3T֚׳7oܿ?333..CQ:Ӧ?qWV]m *UelFEPT99=Ա}^*eurrޫ̷CBg\Ÿ8޽aRHc@`aaZV-DR߿$&&{  A;o݃0aBeoIdgg;TJin+J/vrJN|gccSC!`>Xîn%"0LXf߼y\ftKKK:ϋ/L&}? "nuZ}peoIꬬ,{{{\N>j04e2CVVJ.jY3rߐbk^xK.]hr_;B|FLi5n欜iF"߿͛׫WOTЯdǏW"q-֜:/O&W(>sׇ _CPɈZ ?˒WZuͼb !jYf...n蟘E&J===ԩ#H|>QCtMjB6mXZ( Ea^^^6l+sǏٻ'""B={ܺuK;MRRR;vwI7m-Xݺ?̽yPhU@[={8q")9T݃Beb>Qzzzz{{bGGG~-ZZZm۶f͚7m+!@HJR=%'&jNo:rpt}KK)sFnӦ͜9sǏϜ5Q,'MxȴSml !8w3lmmf͜ysгgG9ҳg/5k9uz֬Yb@ (v2B(f2xyykP(\.W;P(S5?"]z8a4c䵫WdwݯE+c9 B@FF/~ ޱc$'wA{ϼH$*ZOzz =ꚞ_}e !!!kHMKsqu-E Py1k<:p*nHe#iqtTvv֎:uzQ>װo@ZGjӋ;wF6.;w77H@кu듧NBK@`d B|vIVӻe2YeѣX[{Q'Uj3'THPPݻwryFFƎ;ԮM/<<<..NRϝkNV\)H$Ɋ+:={:z豣FܭG˗'%'gggZNlڴBeٍbryɿյ#uBp83N66x~m޴%*:f5i$|:}a 5nܸի9ps&l^z@NǏOѬBf͚_c֭[7h@BȨ*O]ˣg r Z־g"pyBLnݺuE w o|!fᄅOQ'YӧOn`!dR]ɡg43d2^x^ͽRa(>f,^0ΒoPÜbgDEEU^蹻nx!>+HWnK*  ܹsUa8lḶ'bPd2 !BlJJ =نXx...[HɉULB!,WdN0A$I$J,9re˖&nu(qܢj.+BXb_zemmfa jk֌C, 'BX aJ!\0_nC!1;vh~dB2KXBJ B&!!2 QJR l,d!TR{9@JjZe7)J\dck tf[X|*OKS*zխ{KKOrnѧGRoR)ssv(<B={އ߿?ݜORvvJJ I+UՎNNٕp|z!CҤ5XԺUW-[M3Zk6iɱqk׬QKr|ԩݴb4Z`o/ c&L&rpRtBb}b!6==ҥ,k֭L&  ;v>y$hMzrr򅋗޼ oΝ\u/뗯^3<|qDDʕ+~ס~mܨџD˓ &@+WƽyK E^|b='̙s@3kBr}b!ĉ }knP(N8aΜ`KKΝ;ׯ4aa>>>_v\_v/ؿ&M&ORlE@ǸH+GIzYOܾuK3!8N9O,{ PXX,h!yG5ENb<11@$w_Ś͂,/oYbqϞlv>}ߧw}e26l)U!s;H@fۭ[f_|ѴY3 T*Re UN/n߾]tvաc]ܸyzkHNNi_zջwo6mz6mZl5idΒB(]BO)ݼqƌ-r~Xq#Rs}Fy}O?'{ZW; -- o*=jB6mXZ( Ϲow친z1;;s|o]?ڳg?p85EFGٳ͛hy{t^L9}zqKOO;uq֬Y-[ssouU}v֭`괩 <?ը^}5:WQ#اb>DݻOJj=݇raU*BLx"}͛6dM7Сje漼uE $%)qߞߒ5C#GGݷ䍟8˫.cMv=J/9zC666O9sX'OtEMiASmll5<klJ}͛7999͙<%(~iƌ)))۶d>`z?׮D=0e1+_tעU1XC<~A!ܼy3$'ӿK!jZPNxZJJʲ֬^b v-}Ѯ\3T+rҨQݻw^^^Tt~D_T zo\BO)sjΝhnTMڋm۶uujgcXaaaaE5k֮YrrrŕkԠիV@^*EeEbmF(vtTΜ򸵽-!Cw޳{ޡC) ST!s _4lPbLrԪE]v5o~vE%Lp8vBB%j#>-(r5֭kB|ĉC_`og?tݡP(8N`L㣳;LJa3tʰaÀuܸ)))5W9bdRN:uԒK۷nSlr媕Ϳ~~ElՒ~)t^5gNDC =y5TpBߏ#0]١YȀE{>@Rիvgfddy^zmJRcv߾yůkX,˽zyxBf ˗.ըQt_zl_ƯxyjՔ &}7bYxda* |~tC;{;KB+bsrFU^Ϙ-zBra0LP(ϝ=W^5 珍yX, +avPB #L1Ǐߺ]LX x<^4! l6Ng83˵r!>-b?SEx<.kWtN !T b?k>Bt2 B$0"B&!!2 9up[!Bϊح[aDD!TI%$'o.bJ!T*֓tbXL&O3C,MyRr޿oR)sss g֩P`eU(FO9zHm.Isut'%V@*WvvJJfV*<>9]M4!̃9x{7hРperbRx˄-nf@Vgee9rĘI.쳲Tjue7!>bj֪F Vdr 00~zʕqoB']!ifԦMǿx* آυEO9XWãFRgb5D<{'O:P[o:s振oyeo>!d98:~|e_T荰E dge:={C!/_Ҧ͚>|GϞ[4xӧO4CoѮ}]?;wбc.]nܼIgPT6l)U!s={ !*9XJŲX<7!ViBaH..Fj׮m8wŋ×@ ͟.I;sq͛vƭY~u]?ڳg?p8K!dBbRby?y⤋.!dr|NVf櫗/5j_~e Vfzz?׮D=0e1+_tע)i[! .~䩳 Ub5SBZƻP!sI))IT0u5m(BT Qװo@Z` 1Hm:uÆ kE3&+r\ў)hLzy{;vE"yBTjR(vsY勨(}zx+1dsĵO;:sgNry^^}Ei^ 6<{vIS~\C]V ~ZG{E}. _R? 1|%N8S!Ռ2c#׮.⏵h^ &'ݝE; BST{;GBpf2E?O>-C_iƐy!o߱],;tŋm R*Q62K>5XhJ/ґPi3hLx<~ԃv|Bcܢ,X9?pV *T[͋Y4!>jB@J7~f!VCP5Pud2AghР{L~YLLLLX$ Ef!d5*VruݕҤrGQAl(q)} 5VVbGG'.[M(BG!Bl+|<˺#aHTxL>J:-oIQ+6//pU\.ҒRe͊BS-K%Q-.& _z[93&&jw Eqy<[(FWg5Q&(.#yOfFQ`5Q0Q{B0">'5QS FF!V{GawEQQPZ(j8REԄ!TB ӝ^E}?B! aŅxk_mrQd2*5!D!J R&bƎu3:]sV[q(J OPEo8ci00!JZ;!(b0D! #x҇> #,BYӝ: FUև3B)v0"B&QC^`_J[\tjѣ~߻{GUq E!TUıX:1 ީS)Slll*`ե3k挀s/lvm5􆧤{ BU}wSRrJffS:ug*l%~b vvv<4YB}z*tGC|r钥tZ^vmƍ7jvZ]۷o7j(r_r"ii.NmE233]]]R`-"{G~=iSfggk*߻gO;W+Z;ϵk~եs5w7w7o]x Ek3BΝ;K/F[xQ^_|GϞ#""{_Ņ͟?} }EsryΝrrr򅋗޼ oΝLWmSLvqq˗)3[,iӶmZܔ4! T*Q*x<~?߮0vefnb: T*N,+]"4n0...:X,NLLnP4kժxq￧kW? 4hرK|ٽީSvcT*ɓ׷n߮QC_uk{Ԩs/www/-1ޢ=wEf]RU}JRR)IO{kaaaaAKѕ0MKKEH޽/}OH:,H.]ؾ}ޣ{w"'G1HݽZY(8x!4nԬiӧOi%}T*UTZ@*5?аW^Ξ5S_N-A3^R̓J )O*UTn999p޽-.8ؿ?l޴I&mڸVTǎEsθgB(2h`8vf߹BP&-^Hqߏ!)))$,,5|ط111 4hK`XtP(ׯ_irhIմd钸%ꐐ]vV[ lIX4VEVE 1f"(++ UwC,rxnnn#F.v֬j7orrr3'xJPPiiBC煇/1PVZ;͛_լYNܲszQt8jhm۶F }g͚]M2t?ܾ}f_|t3WZ hI|xuժUX#G7nַ{mټٳm۶Yl ~}4ɶm 7cbvի7+EV_۶m9Cq_~;FFtMjB6mXZ( ,0Ě-zxԧ_G1懅щ:4vZP*QQg1k cVڭ{'O޽wmp͛t.&d:9:ϙӧD".;pРOnɔ)66AASIlll݄R@kyS>M $%[rbf{'zyR![K~-ZUqb?/\] !!֖Ng2y2L:Q͟651VV-[<V-[ _6iD???KK܀F{y]GBH%K>QG5.1pcJuyѾ6;;~|WDҦ[7u|ac߀.]bEU(tauIDfڎ;j}<,%%et+:xG`eutĉ'OVdL&c9ݻe˗kW]gU8X1GȐddH"Etdn1r:hk[j%kוC>(abGGZyI.[˫O(Y> c 0fh:}Μs% q6Ϝ9b ^54bH'6ۤ]wiҤ>˗mZϝ;Cǎ7m!4UçCgm-5j :ȕ}mG7!4.]o|JH@~6B!ǵ ?`> c&sbbhJJBͭ+~]\ aX.EU}],/BU|J*])b=G#oذ>ܸe'O@%L@@֭[3327nΞ5pAmNN3iiD"qvv]\\SSSWZ|2zUkuqq1fѧģXP9o* f|[D/ 4qennn@EZhy?!ZXYY%&3vvvt&=!!qB! ?mjH$26;;վ{W~}"RQ,Bx[Nkd2']]5l6a{EumժU0cƌ\>8x6DԉNСúΝ k֭ر#,_2svSuSǎtPk׮3x,WQl &j 2#% x,De2BC%te*JmҤD}z:T+m߾QıcƬZ: knp̙3gάXիV1z˗ۏ 8zTEbbX9 c~?߮0vefnR>G%hcQ߇^#HTjJիW;vʓJJ|d,^W5J0Y6/E(!T x{'TM(FU &XXg=fX,*GEQ|,-rye}XlNvN`v d2BaffgkxԨ׳hP("uvvx8,S4 ^R^B%5yvߖ/5Ea%ݸ9B(q7+n7!2'xB!dbB!BXB$Js!( K@Qt*P Z%"E4(BElzԗVa焂2|ΞUTAȯ`)Bfg讠!@iE"ԇ ]_T|mIt)hEkS)BUq( J7a TA|80BfO9ET*K eFy >EEUF,ȝ_+_W*C_:P W,毈n+ؒ/EiaV~łuE7:uA>G͊5Pϥiݾ9Au~*M(J?n/ y>{+]j3(tHJ+S(Û*NgG ̏j0RU\Q oà zFsnUH ^w*YAEiBlᕕn!Yc!I`E!LC,B!dbB!BD)(BJR(ؚ b2\]a|!ߐq3;ǀ2~2*JJnkk[Dv6#; N֮R8?n֕vFv>)RrM|U*T[z wגg2:`WbL!T*?7@ (ۺ2s2s (MɩVCRJ?}R J'4/ۢޓz7.Ec>]J㻺Ž}cmm3O233D)d2H-§ɓ'5V`0  nv`0_f}s*NCS7dfN&OK{1H ++Ųp޾\oZe)M ڸ&Z$䛮T&C*\_m+R*D|ejzI^^^&N,m:mrxy ꍲV́Z5kӧSǎjլI7[)DSC.)jJ%d/XǣK1]~WUjbjX[>}knkט;7Lp>>)ŧgnk3!?=:O=Iz];M :rX)qu(h?MFv<-njݺ& zV{g#b&Zd2‘fpXLfݒ8ٰ;5gXL ̞vLaE͛ǎm԰aGFO-|d!!!M7nҸLѣ@?yHTZwAAAsr45̙=ۻE?oVlKʩO箼 zUak ָkFQ3L&Q88p/k׮nݺ}嗒Qr%Kؾ]-߿~zz|鿑Dk!1Ov;g;5)I'>)1Yeʔ*}ڲe-YMӖ-_.\5k֦M}+FO`aC4)O_mB#O(͓j !@ , [\ oLm'O}4%Hvhuj-@?/wڵ~z_L9:P1nBq^Ɓi98Eo[Mò`2Y{֮׼={>T@Ǝ;l7]tM[n:s˩֭W^t<>ݻ5kԩ[W \3\~](֮[w˖-QQQGpVXAgXvmzz˗O:u=2ؖ9,-Cq5K6GfD\]ئW6-gW۠ANm+W5EBBBlmlmCBBNn@o:c;qi=g7嗮 YST}ȧ5@ڵԮݮ]\Ki--9/_*XLiZ'OMM1/HNz{],I2_4\ϛ7,Yn:6s.xq̦]*X,‚5)[s鑔eST Fo޼eYP{w\"&:T(M%.`&55OKKsus]@=V^.\ruE ))[n@Q՚SSS55Ӈ-mƾȩVe0@Y_V-WBhcQ]c;#naÆBٻ_?u-F䜹 %%EӓڬmlDT* t;$''/Xp-,[Ә@~s>Yo%uj8)*^tu^ T%fdfK(#3S j/\p괩w0dr@ߴ/~۞ID)#tX {}j44\'OP&9*lTwO YZIXx\Oijq۶% r$j 233gLevvb~6l`ii2onv e.X`08,KON6|;هyB:aiH)[>|؅ kR 4y۷V8z>!>ޞפǽ}kggm=rvBD/^yf@ࠩ!>.QQ\RsRc2qǨ;?dYJ2GŔ:׫Ǚ9S~jtF/ݻרQ#MO۷RuvB.454tX\ߕd+qoЩÚt}>'[YKG:džz1\CF/_Y|R&4o}4uطDGW Y͘ޭST,!=5݁w5ް^ baa'?+I }ޖr(v2)u*IMr[߾ 'NoAq=<ՠ˧M 2%gtv ݠ͛]6/t^hEt.F¦fbZ8T]{s|%q,, g΄֬YIdlDžVKLKҗ,Yڽ{w:]×/ڭާo}:u4:[ntiŲ[RlϔWW+2EnRiڸ]<#\UKSI$ォ=ӂ#Fرkǎ#F$4aZV^ӳW/:_/^]bbfV֒K -а=zvoܤIitaR.ϞT&mUE݌az^=zիGF7֬Y3rw׽2wݫȏ[ [) n]~ߜ܄"MaFƴGg:ul߾]4tq#PK#|;ǪN6<[.pR(!ڭp//55cVUF.U:j ܥK-7BM,6WRU@TQ,YL pe0l%m9l G@Hn߼yIYxK6nxط6n!'@ݻuo߮ɓAA:t$L[4+rtʨQ6n&Ϙ>St)Svzt_[R|OW)~Ǎ_9WN,dPe)%&jnPz5jy\NFG/5'W@N.Nκ,cG0ud+Q2O!|Zg9\k ղic6jh5]h… 7j=@?,X_v>niՖjξamSi\QA}M-Z.4kt͛ |F|7_߾] KcZ\sV"xC/n}ڷ]<ز-ۄѣaauEMg!:~ώZ;J|3M滛kZN0!Gɝ:{Hsp0р[W oi B__o`~ a^OSJDk,z-]֡PSF"z{/d4j4/\$1qB>M~qk&B!wxx˭wc>7:d|c8{ ={:"ZJMү\V;;Y/X=d2/9`];'abFCf1\b9sr^teLS \/;q39mxI:{cMtut̛7Ti.K/j"Zts 8DQ|c&yk︡}nNx2n&2fpH:;>xƚg.*b(L ZxqSsїmllt:oHIԋ'S>!1*@8s b͔|>H$bD"a@Dv~C}.@COh`n L9Owy0fϚJL<$I.K ;zBnpTPcbdY6qn*XUu>5!1*@8T9TBwQÔ2;޺*!Cp4 (@J,-Pbl ` X[%(VRJ,eE̤ST(d`ZeeuBfd0("KE~N7v-M`^bEQ~=v-|JQȝxUBeMR,zdAb2z]ר8IDce2_v'4N3ffiv~Y6W'5G{މ1CakIENDB`knc105/doc/cs/new-cs.png0000644000175000017500000015124311436654001013227 0ustar dandanPNG  IHDR`n pHYs&cu"tEXtDescriptionT?da okna: knutclientPX tEXtNzevKNutClient <2>?탼G IDATx]w|f/K@JE*"P:T)*((E`"^*6@-!$v1ri~؝ygf̳{{Hv qH*&L0QLxr굋NJG<fo, kFbՂ=-%)IM+w1b(!E:ܩڍlSx`T4TRGqc_00kbrkrv'8AKV5 s憃#T   !O9[fګ)eշ+*˭ Ar* P/iwX QQX: %iETYc/w_L rڕ(iptBHк24lNr\XҰH-1.UPQ&\Ƥ#/z%r 槧쀡i-t(6P0z)[fkE]5dUqʔuIYʃٖ T nQiU=U5F;D2v{^^͋vl2ŜV_WxչJ=Uv#7S6URǩIKr+q@xN{謠 r#$QU0@fpE[״SNdrcJ?~$0hY2bUKž*Dbx3#EdaqɜKN1(lW>>>VO<67d7it8yy^^6jG- Uc6EYn0 Gn^  dT2?v͜?S\poAK.x<*H"qv{k223nx{{U #H˯.?3J!sD彲Huc/*hk8MƒiN7ժl7)KFfWiKTXJ鴪 q/]JHg'fppH*X 'B \S/ݮNqv{a+j 񑄀j\tHSIX,ZR%(**te`.tLwcPUX&jzHO+73}鉕prرcFQFժUw:XBKMM9~FbcxI({qܭԔ'N'zP$jLdQ$_EFD<˓`a8{m&$uv֮]4t X,WЙ3g;wy#'􌴦7S,*MfWEˡOcNׇz]E$ţWƐ zEKu0H%9tZWlJ@)6\% EBÉf/O9WR,ٛ݅OTL\HN mR$T4YH]%#V@Y,:tL.]FGEdeeݸD'fq 4ZKB.]?Ȩ̬7NK.O e6m؀;k.7Z 6hذnР~Æ  :Ә4hPA HNNԎ;6l۶/9ء#1SVڵtl*iߪUzv~9dV+IO)j"@ jR `?c'i;1Xi1Ck`zUے/[F%j+JiC#eCSg^ Wڃ#.TKX p3g߿y/۷K}ӧN NgZ{K.?w$n 9s)ʳq0.8 EԨA)+;l#K)kv0gϞ$^'5k>s.]pᜃwPҠ0N1<̆ fGp8wɋ'+ 8n'?ٵkt}/*:1M%Z'ܛlP\\E'{+t,i@{RaL>0FrӘ*;cUXTP\1ƀv]EǑ#ӧO>} 7/oiRuǏ! N'\~-::ҺeǎɱX,8ŕ+VXb„!٪e+ctP@V`)970;lmeWЫ -m٪T t nV4C6/kW_͛7QF>844ژ׆2l=ݺue0Nv:Qzi~ܥ9245.\xoO]ciuooǏԩ9Bª/ͥc!֭[;vغu˿եkWc|aתUk-ZؼyٳgXXٰ(NjGwH7bHPUU7&p34YbU7Sj%pɏ0 [i&FF`dr({!`̮Y?O6? 0)8i;ljBxtz>}G:t(ɳjUVB$!B&V\Ն:]{萡M&<;VWnʕN|E\0vm ~7mbwI!zU Bc$ ޳~BD̒dZv$aI1XV!K5R%A-QɀLɠ "kK-%,Y@~Ğ4)xbW219E5,j/F;y`rAB DDF_tڵkAXbʕ+ǎB((H+XrqQ˖.[Z^P/%%V`ƪ zfy[>p@ǎ=._+( ]0DdjR6Oۧ~f NEpzZ=c!,(7Mgƾ=g;{nT%#ӳXPPPjjjfffpp0Ѐ ? MI~=jU FHj&O^{ϜvPp0=Çr3ѣ6^^^=z٫WFzom۶~{Ys $uۙ2 @E[SIREtEV*SJbiT&bc㪀 ! 㭢p),J\`"=Yn%BĀ#ƴ.s!UHuY"R\ ҇@<ct25qdbxzzQvkΜ95k`81=mt;d!~ |lف>xCX<ϓ!OϤO>Yct /<}ܣ{ϰP0=iz$b[Z|ztq~)fzro{:M0B>]0C8!SDS23(8!{? aPmFIGs>07Ǝ}}y}H-:tlRj6"t [8͛:ԩ믿_詭 w DDF^z? a/[nT@1;lݺ;vٽkn=ҵ7 mĉ`%}zݻw{v;v۷-Ƙ[V..֧dDTݬB nlVɧJ 9ѕpI~vN3`LIk' bcLVU2 Љiz_J*ܴK8$ !CT;{׿OH8TBV &so[FTݲeKhh |w N @v+Zc-Zf͚5k^{[?XxѪΨ9;Gª,B5m#1v|`@`j/^Ф*t=")(9c>SNͽSOS믽XTv޽{۵ktR*!sjbL꤂ѣ/ .hѢEbb}=0Λh7MX,:短])<ִT}5JQh 0`[nO۶mյ[eKa׬^;Vu|=:~=qqq'MѳgXx8vFڦCTe+ΠXpMպʨi:~3$Sd7Uq$vHjUNJ`jժ_xhQ#G^fQKHY5 0bY% ISԈ#|z걷E!2tR ((vAADT$BqbԤZ7.up|u#)i͚5cF0`t>̳X+W|GCCCoH|EoUZ뙳Mf͚5k @7Wm=c'SNA0?vD&MM0¸s.W={՟b5z衇sέ]-m;6#~ R;w?~\Ӧ?S))qBF5{ӧ;o@_|n/WGt֭n<;qhh}{y҇Iϴx+HuVSzHK.h(d&=J}>WzU|pG}$XL` g]9,OAX !c$)9Tx%uar 3bql7ۘpRP a&Y6:C!V]j[fq9 kؘj6^Xz<ХN:!jt_kCMFP\wl';3j<`(amSM! ~$n6io@TlX,ɚvlqs9`TU]SªusJ}RTkgLL(I\VbF1`2F!vDE>>Vk $ u-wA.iV^h'|%Wgdž]dner((y%r 83 ??fX,}B.B"͢^ҘA++^0 3*) $R HEXΫ9TUeaʌ!N~E'*筊mcԀp€*?ҼzE2ύ 4*iUQ(3q%$U]+C&*>nӸBJe RXXh=m6/??!;vp0 !0F sW).݊R-K3JQE_d':Eo+((DX$ldI7Lx=b;lHt@H1f="1 H&3o=eɤ~otPA uҾSd )9c1ZtG̪,? R0HEOѧr5HVL98f1HA9r젔>f#BBOOOg@@`8텅dv( Q*c/,,,(E‚c!E Vg'ʤBO3z3oUXmq@4S5kU+<,UQB#zkR6ICX)j A6h"k<+0rAgKpHq_$OdRM ZwklA:=r%0#P/4UlhK 3^tSI& ;{|!deGŃ0Dd0.eZRMe -db0Hށrf!qA~~aAˊ4]5`=bpA~ OJ!HP alX {@Hy"#bK!i XtbK<%#qbV+ő/._$cd! Yjbt29|$'Sԟ>XHS":818 vz0p$ XnH+)!uSCB<{Xr:^ʦP?Kt: uDL:ݫP؊\ʑ3SU\EdpM &L #Kr@eSi kHN\;jeTWҗ Na1AzURW+/̳2Ҁ]-$6MW#;[(΋ag]g0fSPCJ 7BKܮh32"fMi+ Jtm\i+c0:\(k= ̫nuiE tkp]Lvj+-rSFw}EUx],G6Bf/sCUFWwͰd2,- "d$ K cCyft%yQU[IT'@-㛊E3E Tm wt/-DIhb0IrALUIYӉ4#J*Jd$!LFP VvHe$AZ0`*^{G U-uCU԰`caeiʻF*LJ-\_'M^5vt'xG5d[*I0"/uT͗, &Q4E [ĚWVPbT6A7(M^X#وpAV.#_jA3պibRZ2uJmhJuhTY.A.f},U0d#d()3PMY70[\Z"\ (ϪťH#˃g˞[uڋ%ŸgfX}$_Q5 zn[4nj #ʒbX f>xIqֶ.-PpXP鷂+U\-G:]`4+4 0N[XM)/( X5SNzOK+tS^q  UC>FsP`jSYD]]fӺ/jq%2:akER"0."P +m|*;Zނg\ BdR--@.$P@-jD-w[*@35UErQAnjTT2ZZe#F+Ż ~NZSbV3 w[YϰZU~k^ ^dA],&_ WVzRKu4SyI}I`[0$\Нf k2 %%tX( mj i,'f ͒,o/v]<#G^uu'T̒U(Uj$pG.lc@K4^vt^vvAbsFPEw*QRcdt5 WAL mY誡1r-%JRtpFڢI?;~TBI.rSyLLwO@eRU jH9@R3XGmZ֣ReSrP [ \{!SveAC"ZjTC3O(,AuF,ҕJ~b8% wOYp|u ;(!5wеm/^$%S_04mɠ5lruZr2jYRm¸jQ-J,VO JE `)(Y,%*̞ElxZvze!Rf樼o%%H5?-_"e%H;˵"kA e̖+ǿ$.|XzUˤ*fVwlet3hJV8V@ı)EfU:h6O*M5M .%,Bf2+7GXM@Aw<m R҄WTQL+-M'68f6NAlai'KRYU|QFv,hGБ,"KQROUK2ܛlf_N~ެjkE;Uwk0A.q-dO1Y@UGάjՠ_QWбN0_pH"4KY4j怜ؕ|z\eA]*eXV$cVH#dp6  a4ͮЄCȬDu>xMϺ3UmTŹ~Vߪd. # eR`)۱z݇4F TdAMQvu&Hv&] 1`T7s4bmA RVfr[$V?4')E#LtZ’-ɬPHjy43t0k'.)r'qW*I48/$1d*f 0hT NW[*g*"jfbhŀt&eLZ!Rq )JH=)q"JH4?֟EQl!'?>ǚ QV=tƈ'-Z(, ߍ  $ʓ;NJ~ IY2U $9p=,o?E >,:d1J)3@^e%]萺VKR>{ĕddU7VeXSUtM-M9YOK~t*CfS]'E4^EJע9 kר-1"]:Ц"\8es ̊NEAa6i+QnUe^eճh#TzzZӖ^,HJ tYF2)w) ] w0QQܹz6YY_vYYY)6ã$~$`N3''AXwdeeRZYiҮ3ZPT:$Q%Ꞛp 36_1_3j u*?mski/;oj=s: bF[KggWy>;+4z#\CT-LSv-zo US? ITp/T\$KmFP؄݃NXOc4hy;u]9*j{V@``hX*UFTr:YYYyyS`sjD UxrKrdUBWs"ecy&r*]sRC\U'ꥫtQt~RV46"Id[ڬ<ڿeOO5]r0)rj{D*兄dee9)ULc\PP`/,۬O$.0^fUއf/#E#Fm.{J0r)TPԓEeZ#3J d"awv\xjYU~m9uzב馒x ˃:,uS=dahџw|D=U`m/jX]J XJgG!;:z2ҰJB*tc%9C)e^ Etu`d7eĪ_TQԽdˡ>-+D]IA@`LW)("P]skIVw]#ȓU]5piAs\}貭{e4尒>c#Ցr]eXnQ!!IJ?h %em)JmڇԎ⻿Q>.I%4d 20pNuYUŧU ujgX?­,XVןUX{ IƫUmҐŪBt>}ZjcR䧕}e7!,͓*ҤUJ!jś@ÞZ^y"XQDϱ5IIY(ȔFfTjxhT޵[YhWWA_ PM +Ž9ù?`Hn30TRʐk(jq`U6~=(8VY$Bq4-IUK_[Y SU@%պǶ1)RRS8YV0?'B(00U֡3`r+hoASЁBۂ1᪢Wn}o!Ub„ snNt.ZLn-0/ S'cńzy{&(9yDN_-&JH;d#db348M0*k-nlA^{m+J; ֏@uA{y{ 5[^|䈍mԠtM41bDVZ"yݐ &*2cL?0pǎ=zн:erAqce4)&L5Pp 1i?P0ڵFlٲEӦM_Jzz:6dt.^CqqƏ{Gy3a># gϖ5(bɌcpr>|رOJBsrn $^=z'oL9|(!)'=vR„ʏRa9[֭ۦu6lP1׬Qcpi7{UV>u*??̞=?Z=i߾}c,H#ݻ%3320̧~\PAޗN,8O'9l4n9s@u<&L|{߳>KSƎ;i;n OV墰 _}MO :?w% a;6OO(,,V^֊S̈́{bLX\ 6mQK/)6v3"3~wq͛lzzƌW&<.!aq$'6nO.E"(I<<ZM zn˗T<JV]nRz~:2{ZRC_ܱc`?$ NzV :455Foۦ yM}sn#22"굓'Oq%<,4;'W )]p8^^6Վ{F9Ѐ;~U Ϋ.^l߮mAAC󬕉;%߂‹.xOLڪUk%jyߵk*ٴ:p+;& W\t:y塕 w9J0q]-~~NX zADFEn&Lܝp:~~Zɭ1Ro&[aaaa媕 w-T^Zg230 ,_T5ag""}|ʵ"[@1aD`2a„ɭ&L0Q0Մ &$JrȐճeV˗//؊ѣGoxʕt:̞ݠ~j1Æ|mpթ]?"W\~gkW=:*jРnݪ60QiQ^pw٧O߾}gN?piFz?oȱ6nx ON:q_f-~}gSG?pq18jԨ5j\`AtXbyݺuill%]ָq% 8pE K/>zȞ{O95kLmgϜٻw?NJJ"woL IDAT>W_=s63uys k ŭ{vZjժU6lw^mSL  2 ȤoziUV7v];I͖9k,y6ml6_{?(7jܸÏ<|ĉ ŋ mڴ7~\rrrLqf͚}=z )QQQ~~~o5c۶$o!遁s%SN^^^ӧwފi  ֏7׏͛yQMcpzү__ %K>Xb?e.]Ç_ӧffq '%N'E }gfdYf„_~(]SOє7nt4y}ݧ*~f?v,// i„ (nMKK?~)'xx\~zpu# 7|Ua[ƍ/[ coo}]`q'Nб_nnn۶mBCkԨANlNQڵu3c֭XJ|hRjHUΪU^rvlK/8kn>Z5kM@}m۶^zO߾?k…70h࠷g̸z5s &N 'Npc$6ko|[W`}Ν|bbys#G$ؼlWƍ0aRB&rn޲)ݼy33&0z~[2/7o^jժɓ I֭kiժ￿`xj9 .lٲСC78z cܢEC7jxQ[S>pi6m~l¢Eܷ@#""b}{ c^{M۶_Zًd8qRzt~e11$q9}zjׯMkM &0ݚZP<_x}̕3Roկ_jV"<8А`%֪Uã$QӃ)^_>nCVʇ8&VzXV+Z &*xk&Vzxޫ nBr~'JVXPpM_RK әyVbwO˭hEL8C*#*3c&L0Q0Մ &&0aDV&L({j„ e`n/3a„}[M0axuџ2o5a=iz?/X,~ &L=Ln5a„>{ yyBc4??ǧAz:+)@CvvvQ11=VL7p|zZ5J7nԫW/::ڧߙfĽ>>C+/nmrb_޻7>|x9NS߄ifW\BSRRƍ׾C-Z 2_)ML0os ıcalѲG{w{թ]QlK,WN؆KfffHNѠ~[n$ЃK?lؠ~j1cƌ I]:u<ٗ֕2a9U2܉xkZzڮ]GǏI9jS._eC*0Q q'u䈑޽uҥK?|?uUV}vO=dȐ3gΐ;O2%888$$dꔩwl/><'N# <]&ONN.u+ &Myryyy&L$#>3ɁO5w޼йmڴ$z{y%߼yVZLL̒%wsLVr?jdy'WSRR 0Ƃ EF͟Mu8NWIر"aaa3ߞ k׮8qºu_e6j5ou߿sUzuzB?}ws}&*)*^Vhh_w3pppRRRj;2kԨANܔ_%(hQڷs3èQޘZ-ZV#??TkUbbb͚5իԆqqq__1޽{kcƜ=zh{޼W^yի3O>ƏuAݞ'7h@+c5ZhaΙ3gA$QF-[ƍ Ƴߜ>=-VZڭӦ=ʰagϞu8c 0a2\n;x7mZ2eCtׂ̘CCz٫Wϰѣh7l;tVZ:Q#Fr-vS-]v={L8`B75*K:t ,پ}{5zѩS'6gm:v׬YppДSIb= ~f͜b; hOuk*<yxbrv;Mnw?~ _& ^~}~?+o͘:[XhHꭴigÑQ?jժQTv/x͚]MeA?;;{图1aR(nݼyKy5 ~kXhqsUފ0qׂyRUjk具WNNfc33Bf@= Arrr|\2Z RfLN-؄ә;6\+*y5 V"<) #W7]L0a@u|w &=7]0aĽRZ*ed„ & 1&L({j„ e[M0aar &L=Ln5a„ɭ&L0Q0'p/ 3+\¹ܼ<BcX ԫ[700;h]Ok[+=ϟCD u…zuW.`vwqgJՋh]*1nܨwsݥǝk[+=l6Ȼۺw.=L_W{YoxիoզM3g޳g=3g,R Ǎ[r*}'M*&N\bei$  S&7fw @_6CD8!b9L٧~SL)2{רIW&fff~Kǭ&NW999Rb4c|xB9r;niӦ_[#4k֌ ތÏ{7bcǎK K;yAAAAAAs[a}rL "Ǿʣ#oڸi9wӦM;vHGĥKnݺm˖m7o,[ o-(#=sǎ}TkN>7_ݻf-Y^:xu5s m5lؐMIKO۹sg|)S&_|EKN>}ȑڵkcll3gΒr @u"#ڶidIϜ9ӬY33gJn"3#c媕%؉|#G= `&|T\:Ӕ9gs srO1ۻw^Ç'Ǘ/]"Wl[ox.Νzڵoo\___rw풥A=zz#GW֬Q0E71J>*z+/CϪݬ&o׶z062.2(/I&ƏUSTRR9q`~ p8&M:yrxx8B ߎϿ=|#@z.qF~N2km8}LK@ق8Aq mr ,݄ T|KN<ؾ][}T 8$Ͽzg:uz%FyqY3~䑶m^] -٣'I|{ /X{0k^z6e{tA/X?9əf]vM\iΝIH SQlSWSO] TPQO+6qwv۝efI HeEX"Qxͭ#kkh[T*Cъz`j5qax`sؽKb@ @ V?жB @m@ S * @j\xl8n@  ݎ>0!郛2ܸCgۊ ݻUUd2D"a?k9eV_DiðkkL4^PV^YwPg#-7gzEܺcʶvyDL~AAV\]][b-["`sq[ˬq`0lv}+bڰlgggWߊ6a_~^zu]W%;l(xq辽~a􂹹~hwK h뺲5;,eꔩSN:eZ/7on13p^j'14Rz ]rEv@ŋ VabiAbh)o߾6z)aÆܜ v޽KA<>Tdl߶o~ݺu R;;w:S W_~=hР#Gh" ȍVۿ7n$8лwX1//?N7thΝǍȨ=z#**Jm!&x6OYj?'jʒC?XZ[j5 ?\vڵnnbcA?pWGzNߺuBVΙ=;<{L[7-[6aMD)s/]l2{…M6Uѣǿۺ5@ %SXT? a5ۻoϞ%K텧:t~h׮˶'&d0<?vuu1BBC̫Vp`s7lʶr8ӏD f{Y |}}{K. _UUU=zPUWbb@yڵk5ð;w/| gΜɶƍӡQЪ:lNVdff AҜ9swϘ1͚=ðgΜ=s׵x.;%@NUVnZxI._O8) `BUU^|ʔ)&***rww1}@޽BCBrrs~Z+۷?00JgΜI J*?(((&&a ;WU~Ho IDATAk^"nh`sJ3u C{\vZF$''ǻJ tT@Qk.>oEPV^޺uk*Zߊ<۷ljͭښF3Ҟ4jJPƵ8v텮V2aH7vvvFuhAQĨ&0 `kUܶbB"þدSN[0Qݬ"J@FwR):6^ jk CP [krN]ǭxYnmܿw~:Jt*7(ZVVFьqk[wԷ5~ZtӅL"a(n]OfF)+"6Mڀ rP@yOͭ#jP$~t2[+T*HJ>cff 65adfB$@(׌@ at>P1 #I0u@   | h5X >H$ C1p@ |>D$.fMe v4 0hFJsmm۵UheHc`K–~T4gϛ䬮RRkҤɹsd߿IA_?&aܿ?֭@g]EHmQQQ֭k>:Fۿ?&k…@/ĐnP뾄V,^ׯ_~EGGb@S?L͟7o=jWՖN9G'Nz- H+beDU穿{wM0G#G<MWDջwC&NUYo޼?NP[n5o[n)<H$\ku(,]-ӏ=?~ŋӧgO߅|rГm0aE >TXP O-,s۴`M|EllllmmCCB/_,s·J```///U39,Yjoo`0?Ξ=xyPPPT~gccH+"kn޼)&>}Ν;w޽^۶mbc7^xqRJW[[[YZ5yG? 7RUŗX1z޽{W^`SUJ %ީRUdmmm5WX,8яmMg`GG^:dj1D0@oڸ1''AͱC V-|>ybb2g2lvǏ3]+MjO#AEW\!J1Ik ޯZR[lUYݻy&11V0p֭[KKJJKJ⪽-[>|X(Ŭ_X$it:-??/:tMb PLMTi*Hpwx 8HsB}[?]l&NnmiidZ[@!&pV`͙3wΜ9mڴ93P!ϜٳmlG5j({gsέY0O0!`jU ]+MjI==;իתիz}}}zs_~~5k%k&LUY+>…UAfb2-~>|=}TnSnLJouUJ376mFlvZhѩ'[>v텮V Q(\71zKuYT3{|#ŕqm[իՁ@ GQ=]H$ųgvv*+++?{ָIQ\ ~Z 1rG#|{ թ;ؗP:*P(lv)uvM݉{Wlv͡+4 c/#@ d0I$ҫW/qfd01lLdhT[[[;U0 ۺ@ fI$d0(DV| m"Coq "V?жB @P DkWJq+y@ R@m@ m+h[!D@R 8n@ @} Ro0 A6brPT PzRT"6]|>?/7jfffmԵ< UUU^bH`~Oi,VeaQs/j֊MbQ/"ŵQ^N.tZ'hYYSYQ1+*8NYYն E"HvW1 HH"HT@ J@̚5׮]vښ5:BQ444d޽zQ ϻMǎTiJǎxgǎannn 7<_(2uob#a3g۷_GQ6o:u>4|>V|*T@LȖ'/ ;r ,liǎ^\nf={ִ:tH/,^9> @􃵍ͬYo߽O?>{l;[[*iǎ3СAzyu5kzt_ŲlٳG~}߸Ыo~}߿g@d۶m}ڵKXJY?}!:;6= q*9_VL?PݻU˖i۶mnۚEYϏ;ɿ۷9ןg/)g<[q/^NztZ~ֵ  sfv K䛂>V%ZJ}@ ӅN_~vZK} @ @m@ m+h[!D@ @ V?жB @m@ m++L[!D|`rpЗY3,߇n@ Z#3 @ ?ɣ#]EaEKJJ6m*D%2||[}HьCI|{"YH)>MB232לO""}EHM7kڴ[i맗4u$dMڵ:eY,;gGϰ%annMcczD>%ȑA2SRi~x|>@'p=zt-h^0Z3 0տ_>ÏwYTXt̙3)]xzĪUsfϾ{gϟ'ii?ĉsyv향?z~yF߾}x#G^Jӷnݪ}{kٲ%~ڶMm۷hϏ91P\ŋAA˖/Ο ڴy[S(1G_p?-//xŒir#v66@'< ]zw7Md`!~uLzK,Ylkcckk$⥋x:N+*.NNWme,Y LI?>}:,,|W^muhza/__تӦciXXAZ8$?Vgb2~~CA̙qfF[S(k~LOSNRRNHR@j5?xMpʉ]:w,k^pd`!~uL[)))a1suuŏ]]]x<~1v߾{챰`-YZJjg ˕[YY O(,*`(I"_2lA DCi{{{[`bxx5W^v)JkrkJ.ȐLٳgL~={\]rʠA>|g ?}4n۶7o@탂}zUc[[ۼƍrsdߺڵۂa؝w~eMV333P`0%%%d2mmmp&:88|vwsO?fgcbml̙W&zJj )G_4nᄏe ڴi?6npvvnفN㉚o0h <=|ٲ>HR lvfVL`˖-Baaa׵if>cc7 8(8:&~0 xnާwМ\77u'TUUῧVZ};O2ʕ+:zyW ;wnSN`Y gNQ3ܹsv튟1s&˵7{ Ni6MTUԢɭRi|䉓bthWZi%&M|2qLB{lv,K筁T*ӷoyyX$һrQRT8`V},멩ffڌ>YO} @Ǎ[ߊ@ uPX//oo2dGG֥A+!un[ &LHU[x=6O@m@ m@ }!={& /LfOO ^ֳL܌ s ~6O@SpV/w5A{EyeHQ},X=4e@ay?✠1tuh|aM _ߧO훸RHm)//So//Y4oYS @RH]C3#u0zJ g[ͷwюS˫1OP>Ji;2>ʑvМf }]za'wfSFP(#eՁUuر#GhEaHDP.whS By=-@NiuZ&xz ەz4 H +c)kG'KTaڝlfL&S2Q>mGYl޼i ]n'dZXXd(..;wn~~ǯ^6ڲchZ 9RS4O󾧿\h4e$!{3 jS<߫a-)MYiqo$rdEA,MJYQsj&sk&ϰjJ/o~SNSd[XXt5::y+߼qC z{{ϛ?o@Mc `y&CߚD>L=1ˎU~[[sȻU rB℣_~n@ng|e B ZQ ݨ!)k7E}6 IDATqzT YU-Zxֺh<ˍ?+p敫3gڥ,=z}vSj ȞiݺI} ؓ `=] J߉2K3|Z~'J oGeK{U|@&- 3(GA@X=\BpfSx b2XgK? k`{YTI P)i߻Qw$=H|Gyr'f;G3 @^U,@0c)%D{YY+}D"ѳΝ8>Z?eǢb Huɕ ٲ%b7nۺu(jKvH{ĉ|ˢ]b\t=p֬͛7m^~IKQWI` EQ𺪻;AAQAIAS/‡{m(J'=hKkfKYzd|IȀ[5(oҖvI\$$Zm)gJNX25@fyJ*3'iOS*io^ WLb(dNCII;v씹&L5{߼iѢʈPmO vO)*m7~< n˖OM:\FΝ;_x??EtԜn۶m[3**2++SGƉ@ x1`1nM5ol?G"q~s'(RZ%)ׂׂv?STZ%-מeHʦfx-K*C˻4)X:-,UʶL$_)WJ/h[!^Y'rBB M~TBw?㲭+'mD}nϞ= eDTr>|xرM6NYbVZ_ge6llnnsնs켼:>IK߽O`bee0?nӧOZbnns?/WUVvu'2t1OE|"ȡ>+ ځEilC^F!~6VdPC)dRi_u$N $OfŢLJ7WފMl:?+ʧRD(rX=db[CB8|x^j^ t+jee{̡t*K2ejȢERW3gj_R4##cYxؘ1cL?;"nٲCz!H[/sRk@>qG1~t%G( WbYNdOJ8';1!;>K~'5֙I%z_t"q|9'n(I9:jo߽kִif V#D;2>ٲb >6ܸA%Rgʑ0! 0sY(b⢢%  UB.K!kLsz;8/Ť_ERƾ; ٯNO@ 2X"qrrԩ+FEPEQ 0Bǧ5~m1m5#:5WTUT 8Fa(J">HawHJGJL*2CD2 Tj?dlE ϝ;wܹEּ>TIIhQx"SLK,YCi:taOh0d22l޶&%%Θ1fӒ FGؾmm1DYjݺvqSLԧw/>BdmTw[7n:s挊ꗎeÍW۫cC Wq^|GZuyJk=D-lԽYSEDկND*^U=jȑ:q?J$Z...֤ZJ>}mmkݤq"YҞ 쎏Tw0UŢy4nԶw;vls4,jF[_=L6dJJYY~ZZZz2%eڴiҘ14q :sG)];++[n7o޴jۮ|/_;f gׂ>zÜܜuTi*T(D_(Q!B~92)) O}7ѱݽw'ȹjUiL뢹ܴ'޸yKɍ }&M=܃ݰa?|aII?_11 bh0O5#)eBNPȠ*"gBBBhHcdžTGD?y2u8}ttɓ)GTs$&H$΍3@xs8_׭KI9!KU,WUB}"%,uѵ/O9sHHJ@Bœsech:9:8:طm]q~;x=5O^||.]Rի<.-NvM?v@]ƍf ?vss+**&G{y{={ð۷o 2@MM4),,k˕@|AUL2F˷0\NӦM;tp) <==6URm M//Ç1 zʂ_4Հ;a4Tٳ#hem<O#yVV,@bƍw9]2336<OѳV!:*d?~b2%D$}:k];wͬ6f̙0)a  ٿ'')#F\|yqqqqqF&JCBcF]v̘x& Ԯ];vŋ *2"-r#VGC4FbW,_b]0t&ѹK/Xе[FlҸѬY~C2 :dInMGY;~7(___D"HzY+>VF@}LgrJUHpJD-O1o56HUVN-E|;oK歚}V]8,d"(3L$REPARYipֻsFmLrEOў .,Z+W޲%^t`i{*dMltH$*١cLXEQT'1$LS*%BT(" &a!RY%#b/<_h@ 2Zٱ}ێۢb(K]/Խ|"c#g[HQ2Q$(\]-2Km?}=5 p {>;$ٹ|[ h( P HB\("aHo5 u%`\x~u#:NuSgnb܌N')` b4ޥYs{i`㪷qk͉` Y>reRBd FP"T(LQ̨h&2qTo2e*Nh2pwk2vYHU* ^Ꝛ툣fZUm//nʓ[f, 5ʊ}㯃i}|"ҿ)S@@0 v=dǑkiad04a;Km[mto6m~d0ao߾~E+#"+UVVbTh 0l(Gn<{pAʊmmef$"K;_^ݓ~+yݲ@ïR`u 2~r#Yig_h &FIэs?uw۽fdžU[qDkU={d0+SSS+5XXUA`ZռcZm,l4KW:fYX[YZX0ln0g2$2?m=ַ$6ug^0}t2lAiV`Zf~?Æ5ilϱkҸeੴRÄU5j` @4٬fӗ 6~eО^;G3u]Ӫ*~Fk>}ZddT~lvEEEĕ&!u.fUd2RY^Q5%p sw6r`1ALM/&)jZB!`0?f|UZ b*jba[MN߶a [טw'.8n!d ÇM7J$$VMPJ~L N[6Zkm+#"Nvvv >}K. p/#6:՝#KitJU4nZt*][V# F{/[(ѿ?;T~/B\U7pswsppmݻwM6mYVh ,D_l)L>{O>lʏYⷶk!&z-c?FֺT2 o3 m۶qswװׯ^Iwrt$c 1QKL1t! jIt*h[!KV _3N׷B EѩS&oO)C NQUMqt*R RQQΣ= UU`ZXzo C9{v xQ deeE\\UuYYY͛7P:Fi\IS @rggA*2qW ANeZ[ꐬ3g:L8| .- +--X} mUک$逅8e.ӎt<`q;.@ +-++E5wרHVGnԼ*92Ad2jouk8ri-qqϟoo萞={Czuhkk t#4n4kVP?NNN9|}}X"iH\&K,m٪U^|6NPUU Bބ?k6ǖ+(ֽS @ CBX"AkC^d.sǜ,/2jOI(bD(bFiȟ, oVSNϛ7޼ N. R!w^|yd43_9Tee!XhefnlܜDQ̨$2E2>dv\NGm=!b%( 0dJ!FH*1_&D_/|#֡9 .w1.$RQvC(@l=5bFx{io͚Q9F#& |Iѧ1C QNGm9;]ܳYYZXLJdALg0)fTD ~W9Pj%5afvgm|:u%'q< jIe0IdL`fbʪEXuCm+0a^n)&-tɛZ[[teI4 Tid]bB"<߫Rǘ)B)x[$=c&iÑL>pѿ%O} BDE(A (\>SK-gǎ2'ɂ*!*Ǟ zDNҰYJ;֞SR?ӡSݘ :ɌB~M%#Z@,erNښԕR "䷇*1ւC q#f sc\̕vfff<~'& i߶y}}BGb ߶ݫ&B^s"(?Rd%M)i ;*P(GV(H (K&3:Y da, A+vx<ے!(Y (aȘ?aA|xVfۇ[Ϯ GM h֩-n=sN""9GsܩcT[!@M&FGnNشz6 i 1d܊amY|)~W:ޓ~S9Kiٱ^L0T kLwaM\kd%DEADe֭ںҪj_뾃`E .m{ťzK]U v:3iy|sΜ9/,o8?7d+C%DQ*ڛ&(o{v"%Ec݉%T/:MY 1puܡӔ6e|a#rcߜ8 b+hqm y\NYƟ9(Ҭغw!PwKU[Vk7z+)_">,Vp@5ض_7z!ͥUp6PJ';dlY։;dvӹ2$qOTՒngɼ+B"MiN1IkiZǻ^ B5 x~}~j`W_yW^l\fMwPI$BEڹcWlmjB">&yxX`[W>JI!t$If˧qt$, `m9#'I]@l-Faa+5ñkeꯁ&"+e7/\JQo4nhN`$ܾyYTRdͩ}떿ls 3V\,+K`2z+UL6X`aU)qžTBY2"I9W^-STyea*\FU6J 2-~ɝjǶS1eBH$'{.IQf.w?"L1&gW)"=\O̥Y_wbġF:/W˫EEB.l^jA(a#I酲Q« ޮ]9cEL ;S >ݜ׮]3йW{//w=ntJ/u#=u?YIQ%2t`xf\C<*Xxǭ]~B꿿$H!ta̗ )(zM\QTϵ*3Vӧ>)N8.8]&ي9;;x&vӞo%I|ٮe뼺5`Kk/o"2mm[K<4u&0Rm,{M]0Çj3k?_B*-JWČk8jnjє\.x<ѣ uk MM 8͙;WcF;sÇ ~ԫwtww[|^øvzxg//8MG}8hPMunF,%X>!܊qەzc3=[m9m>|0((HCWYQ9q; ((CZ5EsyÇyxH>xBLZZ@@e5iZ  Z_aԑc+o8!`#ɍmZcBlrJ\>&}Ya& Əw}M'OjP>oqq+ ; [ӤM%e׬4Ȍ M/]cwm;ȖXlBJf#;? 8 $wxѢٚ鋗,H$o~˺e;9;_rEP3LɓEjZ^^k[9axKk"լAͭf՚f~ǭ9b,=kʖ-G0|_~^g[9axKk"լAͭoSfD.#d(kUB!7Vm'DX1N`S]AV[cnn^``@έF`tD\*njSSScxBsMVq !p<^@l6&m0]X;?kS,@+ҵH+ ^qɩWUv/V@+P%׷J4x_al0T1AlY}}Q}}[5V͟?ȑ#G?:EM}M7B&@ǭH5ߎjKLQ5wL'N X8t萕>ydӍVPx<%K֮Y-1Gɻj,A^Uc 9d2YFFBhܸ|}k;Č= MLoQEFKwj@0iI'GGGBuu/'Mm2kiVoV_W[,RЦ2e@qjk)8'̃ SpB(<<6HJMݓG1 ӆbVtUNNN}Ν;:kl@i*l9mظa ޭ-6lްa`{8+I?_n0[P(6mBhm\;NNNm<>&@lرc}я?펎FjJ_9S/\ 2X'z44M/[|̘WW)wymƍ[x| b+pi'+ߥKMIs3sMK;cݕ6jb kuUu^{Ν?7lذ*KAV=JdaaajkkM<UH~[̫cJ%kl I17//0 sD!0Сýz6D&EEFTrZ`` B(??Y7n끃:uҭ}dijmVg>̓eee?]Mnkj[ r<|X9 6nJ%ɂ kkj: /^СA38A4BpК;m`u6o1c}CBfn5V̡yIJCn3w>4MSnQTe94a1UIÀAY.bqդZo3%6nQ#oܸ)inVc=== i9I&<.%IJ!CJI[s/24h7U(zidDD}}Je4z=="$fEvpa@B}zRL&W(\D"HP(x< l6[ pʺ˲sFS<|of[-M^k&xZZNBm.?n:ch?@ p6p ;`oqQ4M!?nM%0F4@l0Di[!M4VV19͚N=n%p)MS4Em{N0 i!4MV`ǭ! hi@M,3p- `(&> Hm!X@$i |+0 4Mfnh!MQ pp FST߃8M5NM#6Ks- B+1hײ=>p4`Aja`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`V`4M$RsfaX[0g;=wIDATnVZ&Innn*++ Y,eo8`#nnm=f(.jz'ӭ?c,iCdL݃$IBH(uv=3I ,PkF&wBng[g% ֺ:@Td&+^d`}j=:ʂ/Z ||| pZ&ozFZM͚JQTMMC&k@4d,IH6Q燳E*fћQ)$mPp].5wFBib'xRwL;;clS``U,kf%U+U*6'*oߩ7l )DLVR+BT${%EQsf -ÀW^:{ڵIY !ZP)j;#L{\RvǼ*t0083 -ۺ=wܢ r0ڵ}uKL0MГv-[͛;'nE|PP]Y3CB#s~u+*D\7.Ej gߋB쑱ނ#߯[}65$'L<!{nS=[R;F7#LxT\2nNW|]7V3-  ,Y<`@MVۧq+ڳfN>S_\sEA.@o47.ԝM i̘1C _ԩfڟ^hV܃՜Rj5No;Pp4S`]FmIR4 L&tq9rȰu׮Z Jq={6^@Y3%elPt?[fcc6mN#*==s_B(#=}%63uJ4#aa Od*+˝:C\OvR2x>Jl&xot|/7Wu5҈6gA!" sVzrF9l6"вK( mEGΜѽ[iӦIRMy]_}էW˖i*訨訨qqJ; )JSܹC՛6nݫWXͫl>{kW#izA^ciI9)C5K\T#jXv\pa޽8lN޽̟ΝSԩSK,aafmZzJą Xw/1"LYp+bvt8/~RRv˻7olX]75Uzm[bZu6oA4#U{.Io>{\6kpУr5";ChfΜ{]ϋ.&'%i+\zѣigΔoݺUSyҒ~Ot" /]p%HԹK;w޺u._r6lTزeKEEEڙ3tr#19ߧXCo?=Pr =pq̺sף6Czf态o_80=#C;ٳ`fwBsa һ!C!f[0V,r;Ӝ;keNN]_avo8pݜѐo/]:gΜ?iν{{rkjEl57?.i  naVDsk%9һW/.#tv^`M:)?|\bÇM;65M_b ޷o_||@xѢǏ?Ez萶qqMŊ:`k̛Gu v0~Wg ։e=-)+zS:kpj]D"[Fǯ]jNh^o؄LZqXey&JPv>]WqZkIɨILQARR֭[9ln(Xlnd y\niiiTݾ5k+-VPck>ExB8^~.Ly\1X<~;vȜ8ibdddHHHDDDeU海OyyT*ռJ4B#x_1 Çw544o߾Vڞ}|}IV7K64(C]s?KԲ3vdZZ(iwՉ3sOSŽݹ;NU< ! !bꍦBo9i$mɼys.]ڿgg={j;).*C=..ŚrX-/*,twwG4- _ye4=`@PhZ"/zcP\TdH`ތn'3s;ugs1Ī,νca!:6f3iiё&ƎcwLٵkW׮]u:^` zpLj)Q YԢ!)|cb~-, 4֛JZ0ܹ:uhN Œd<!TYY4{;isq. ok|VZU34jvŤspb:ߪyr?mBpy\(>!4IN^WQYQQYcƌ͛7_|YT^ϔi?Н,F6LvB379$VTq嘈}Jl;V^^^dUN#c='$c"hoF&?-)YJ ,ܓ&I"(cŬ9ߊ:ah`y<Y,vQ%p'.OXl=G_~y/f8q\^NH0Bt]DӫW'z۽{~:x9g޴aO?kgPl캓v U@V?|pАrLn:ا6\L PC2R!a4/KB_hh;wlvȆe;#h:/LQeԳiЂ޷]<*D,'۝.kR+[wzhXXX@`'o^;}lX$Anl= 0G ٦wB:+Y9C-9'ڷo[7/_dA!ܮSs_:3˗z8`Nh[g%+gE[q\(lw77\nA!񜜜x<w;# wd > |>dz}60Ng;nVS ]=#{#̃ ̃ ̃ ̃ ̃ ̃ ̃ ̃ ̃ d[2ƍJibs7Z`!\"m=${2jg]I;EFv@~L&cٚbUY?IDYXZNs r燇{ ]-1 f=<Ԉ_f9΅6=wE5(,,H&Ç $7}gQ:vp[`;gѶ⼜%Ӡl5:3dWu&5W@i:}tCa:r4:^tJ؀G|:(Dd_wu]&ĺ>w "e蟩?]Pl #骰QI'J$Dٰ>R-F)s.3J))3RBz*JQ#(w4[kQUS#(dzNqxp$'F {ywJ'irh <y5d nCERطb[yUZ_[`N^--2  Fg(B,ˊ'UUX4$+ܐh cpE^KvTJP;񄖁p1B`6'^b0tAr!n)KZ.f算”Rcrk3 MW[::d#*RX[A*Sf;t] .>"<ÆR8Yj t&&b,A.qjRKd N{ŭ>EI0(C݋[3!xZE9* PT7S櫯ڭ[qxLj؍܋𧮩]w]/|uIȔ0KJ3@emݺ/ܦu;jj;N$xSҰonBv۹s$SJ@ *+!%: 4S5|(Bov+  YAyo:T),x_UK|~7zZ~ z:v7߼$bv‚v$\jIĪXbPMFeuGT" {F}G_zi&MQ)4(q83{^IifJi`-X74::JʻΨU 0Zf=♌%('0ysk@xzSnx!kajeđaupΨ0 R[_rtAq7>蒝V"+JԨAp'#OB˲**/loN;1ܹUV={7?1;/y"A`UubK8j)cuM)LB(*2Gih]nP(aO߾NAAc1lQ}0O71Z^ɧOvxQ~k׍8R;pl[vᒋ/ݼy㦍ذ={ /va%xAYk{: T.RuєPJӝO<Buڭ[W!tڥ[.KcvN:n ݽ{u]ۧOin]?sUG.c:wrLg_ugܩΝ9](ԩsN"VTұca&|Ν7|I'عSI>/h}59lۀpK !Gd ת|@ydiB\cR(#/Zo)'枳[3O?6ș3X5]GSfğ|ɱMQUD:߁+Tx+z-V+`GcXWj91I|5C_}y|ŭ[vu#F(--M$}# |Q_&Ha%7o޸h]HB\':t0K7o޸qh,Q$d hD_hȮU(es=wm[(|uKl~ǬA{p/X@*Z^ 奐Xh"e ;ӱSXEIWuQG;5kC0zjKL᪡t&3Jqϟ*IXv],{GgϞDng='ڰ~O{(,/| K.?n\"3{)eeӦVZ6G!&p?qn,GeY?.u ifi|ɑ1@wݎS}V&Uvu]YKTE:{om.QUoD-\7xE!q.(Љ$k ?,ͲeWE[&@0X@(P. (PX)"KJ-b9LpX@;<8z5G.$Q6B. NF @]Je9 ;=%PJ &ItO_vA)e @]c^8ݻ@PG*Mj9@PJ, ,lcG:,_r{aS¶)]z9ey/X`M\@ PYU_vԹӷ~~5i䫮q=O~w jժؘB;rHbKR(]K+,zΝv-"߯U+۶ 8{#ڌGf*+3<3fL,ysrr(KXЃ[Rگo1]>p={b5Lּy󰐛n)2cǒW_}RZ]]})'kwQXPp%\yU@ޭв;ww_S(Ξ=efW^PZ={qC5F|N9Oӥ|^y!CԳΝ; 0թ#|qq&B̙ڵrI'.3sLĦ1{ܹ۱KG7n<B:?ZԲ,iwx≢}`ouFhf9pRƮArHpVM]ǝb^5³w|3b%t`Rb[;hI}!E}Z"XzDynCNϤ)_Æ@O;C}}6p _jEuUն~b&`YUUO$ﶷi7$JgN*ж biB}/,UWM0QBڶmD!|%[Ŗ)S\\` +?[oO&OxUK>^37k[^^>ܧo߲-ZܣY0 /pz9t~W^pSO=U(#u\ zfd7;w*7?XfaP<ԜϿkݳ̾oƌ`08v?Ώ>n>` e7o٪JoiE&~ȥJ8k{m2/vCFMm$QQTyfb>hs *mJ˟7=#`G h %w;y`y :EYaRUU5Kp>ӿ=̹E,- ',7a'ÇO8A9<Ԝ7󟢢""lW^~3gtm㯹dW{'G݄==D({CX.p! 0k^ds(cY1c߿ŋ tE̒0tb 4:s*ebP(Dj!3- b̬p$eN2y̘1!˗͜ukkkk5+c'Ṅ&Lڵ;o4S\TTƿ߸f5 ~3вeK ;2eˆ)$tFwm2d|bŗK/yWmo~.6ۺuqFwiwM(cvc 8(HWD7F_~z{va ԱNݽ{?>`@۶ð! ?gܧN{Z4=w@RڲUoÏ pQ@~^}׬Y3|\:y[0۷_߾F9xpYMMa3.F_ziܜw'Mw瞋|7ۯO~G\x~s@9앗_9QV۷mEEET3̤4*2CVf!B˿+tD5BwdF|-q*&? RI@KOA5GP!js+fF lc`kdhQȄg"gg#N.J抆srs=|^^vѱXgbYJmsK*o.#ﬣФvN0ТUzaax饗yv&DY#5\xzs;y .`޼yO<t1R_,[,֗!xYnvڼes<.=v"c[O7+JäI׭[+ڢH$2ftI֯ڭǟ`Uy ɉb3g>$$PJG>cꍹt4@Xgc8o2l}c17mޘ@nyM̈́뮫žz'ϱXJ)Ĺߴy#?s^~eF!7"QJ!Mg|s2d !yɘW)L6md'm>鹓&LϷQ\2nճgi@nc{/Rdͳ׍b9/ئMfGK"V>ɍ׋)"Bn w~a }WLq{̎ЃXһƩ70㯙gy&YtƌՄ0Aڷ] s IDATZ}thߞ_:ztZzxeKKK\v9tgC5wM77{7^\ڴm;i~[HUlBݻx^^ȑ#owq6CA@H!O?qj|WϞv+;xu]O0:t(|F(..~f|h{޽q+y|]uo.<@D)4i>RVV7opj-Ϫb<nhL!KVPN?,5/qV>"7(].pR+,w'&S<%VxDs#qEBd +.5fI$99n֌IH gϙ ćg"ʕcᄐ|@b1P(##c%K,8p`vv6j~K;On]zٰ@F1ino(ts K쎴P=^WZe`Xx1w'Jkɝu.q >͢8;4t76 .b8ubgڈXJNtFx$P~d(b #BI nN9@lcU/sXhl!v.(JklXPVJԕ7!9evq5A QlJg6fqJ䐝JgĹY0%'xSqf[>m(q1,KQBJ(P %/]dAT__'s= |bBpzx%I b gs!swTV}ux)x73@(n-ѣH/`ĢQ [ W62|m,gA<K]j.֭{vii#߽לrN%ߧE\⍈\̠ZSU8GUAgDO[c4Ya(xFلwX[Yx,x*ɉx)qEbf9B K]Q i4h,b-rLA4YЏd9z འv` %NQc1gnԝ0Ji< %BKXkwwѶmp8]gJł!,{a"UBiiKKpݺi.NcE"ݻwW)/PaBoGff=B:l9=9'bi?<-˺UX_e M3ޅphZ?B@h#Iݣ gWyJW @QVJ:8333V^?Ǣ:1˻4+;; FBq'; Ԅ @KuR6%+;;+DjkLg;BlbFZp8+;R;Ogffv԰bppMn/Iduz+0x&M AAXWdAk2ܲ[sjޖ`h]28Q B3 :(5M-T׹d2^MvYDqeU:&SpuF*x's d"B OLrqZ0efevjkcSB1:,_!c-Z&Y^BjFJaqѺ)XbfCl(G.=pNNnNN.qf2wV8+$`+~18c`dhh ^ѓ!x#EPY*\ *1#*bJglP_$WGa&'V}lxl'iww8 M:ıkmaF;p)U[/+<#cQ sxR@Ёo-)`3߰2>uYzP*J0"Ti#P#vH)"ĺƜJqkJmGED-ǧD\RG7'җ隈Zb8xv嶨NSшԈpn]o*jX.vfB0+,zFt~:JBA.6;y3i2)&eӎ7BHʎr+n&6(uqx*&™rbn̢O$@Lp6(HNg@,Ji(R WzQ K~P(Ņu"Zb]'ȅYEB%d!uYR`>9++KEpl4%+g؞g詉'@ 7y~Fk)jƜb{.L.j)BynWt2ꈢ9`*ڳFzŏĤs2(EX 7ͷ6̌|z4E-+c*ɷ\bǎR۶-$0yrD$8pE1>Ym4OD :+Jlks|Q{k m jB3 oi{mz鰀X#a1 =%6 QU- Ǎ9>1_qV z26`*\G`pWK,AKsŤB/ b@]6|:yovTA\_YFFON94Jf>B: V G1>O b?^!*(9;9qs]r-%tEO)M7VBj!`-X* l cR䟣Gt+EﬗJbpкD * FzAi]n4P]T7FVܕaXYA*(PGbx⅌5l~=|W$EtEmj]h**n_7#`a>6ۿR-tPC\IbX=¢TE(HlaіG[FŔLW h@1Q)24 $h m2 /i+=2Ud#ڵu8% KBCCn](@e;Ty hAy ='߼4S6MFV=׺@*LIJP̢5rtCL5L^k:Ǟ*֢̫c0]W\ɴ=8ur ~=l[g@k-z\-HRo.ԤtU߀A*42U&&pt{m hi89"_Fފ*l,# B`//cvStAV*<>~ZυwUGRÃx-`V$'g>cl;:x+( 1Apks eZ* 9Wv)G_~DnUR;E_FC^ސ$L4)}LmiR4-njs ѹ6mWBjJpjTKcWq /%78`X2U[Ƈ\Ue)|y=!V! -m=Ń%c7 }˿e +-;eQUR,#얿 "pI Y@5cЗ+oxA8Xrdx[`PjBn4LmŊs'6[/ZAGV[1 Fլ뙰7{9=쀖*g֫EZ! V(ヵ8&UzMA7í 0&([L O}hة]\ T2NTWX>zVO'l75pn6ikS9)vKc @ŵ|pEzz-OUsyêR2VՈBKy?$dUc?*?;dsXt4Z-[?%QVLeZ~0:˦0uܠ nijɲ=SWQᏝz-=%32>u=18IjIDy$fTlK Z4p9E.ORk(SQ,m=QZ&w\פT w5Rg t|Ձ{W㞟[ѻ$狩 5bWnxݛk2o,^kr@ߓ$PkȵC {u(DʹK-RABOG5ǿ>$(wq\'mob::{% Z0!Z\7odu0L#|O =DFSDS[T <Q]/SUi0N$`_Q>=H@j˞U.7|v*o8-$  W Np8E9O_Wz/ZW7 F]5#ze#a#b@Yu6b7w#Rzn룥]$O-$E"rk< k9cRA#@#.2J5gL_, M!!P,/P(gI)U/6Agb`OW7@딢d>~ţ536_U4 >'3怘 ]ƺpD:e_#`ep!_|;8V DKjS˭+um:7RF@@7NKp;v=>oK 8'3Dž^h*ŗWe{q q"Ҡȣeen+<?R^=g4UF|=RI؆7if$mR eؼO+_"]U}އb?ՇRT(?SX20PMl2}8%j*_);抜Mf ĊAdl@O7t ʾiIҔぎU&J_,נ] iL@[L b:1UܧJUR,.~.$A\S.kd\BxA :R"J 7DW>7bǸ 5':a9]s1.tFZAP>E"@ x&>-UpR {wA(lQU[5 #* `{d.6LU jD&C<%duuu555H jkk,(*:hR-A89s^ҠAz)^ >ɍ|`*#1!0 K5 YM> J#;b- \䂧M5bAF7]JG6LUG_H9B k@BŻ=TK|Qm}7(G3W.i8)t㤓oQfœ9 %|;ǒe^{TIMiB§ *|" C7ATKkI2$\oUݮ{ 6}]7/`\S2BڄvQOn IDAT˕UQAN6ĉCQA=@JwŽ.SO0a"a8*N=u℉**i;{'x;aYV?c%X8пLDjb7݄,[$4em)0Up X<&p#d0XL"aW~%7w/usO?VL40a⤯W?) ^|K&N+/ϸoc[V\9c}cΟ?+5kb&WϘ߼lu~ hQ,+++o_)OG9󡇞}YkF7yK.3fҥ_\pᅯOꜷr ܝ^z b]yŕ/03;Jy'M+/O18ϦԦTeOWCPI(ma xn]8C PAg>E:qrbo$ #G?OJ;-JhW_:Rx;222m2^viii]v9 3!uRQQѷo[sֵ+>{nݺΝ;|T{Qfؿ?Sݩ❶On(p]1A"VoA/BDP,L#pz!hB؝_P͞{EC[gdfZ"mbY!EGuNm'K~QS]lEآw ;[ǜ=񚶅\mpӾ'\qf^G}lݺLN}&<ɓ&@۶NvM&d/!*,,|7O>)*,0` 8_ ;ߢE Se*͛7P^^Ú0a̙M4ڵm7 &xrrryl?J6?P<ɯv]Tv_%s׀ =l &\ 'i@}gD5L yF\S_,:Oݪo>_EcsrrBD"BԌ `hrfoj:-#;Jkk$եyXlkM;HO x'niٲ/Ot/2GSl߾GRF! 9g޽{=hϜl -zU+V\b_6X={{B%^r%} L2ems7Nm1Moaٲ/f̘˖,Y `@j|Ec;&9'۶x,'iS{|j9}$c\InHP ΄W(i`J'^tF2EqKG$G%bW@Yt|'уGPMf='uC٧!Bl'Î=Um9mo- !'jV0e}_UVm}8;A}_Oٷb?z_g}[Vumtu]D)drJIGz65T5/FJ~&i) 7IHfKSQ8I$oQ,[aC>}^d늧j|Bc=F)2e ha{ש$ci]uf*Y acvŭHuvYz0Zy?_+ _zP XMy/62}k)9Rjc]Ew[cLax$;U9ٸx0D5jr)6I4L!̮ ˞}#F޵?ֱb۶eYmEF~P0O>n+wFi$EW_SV݇ e;Zd -=os _1(ܟCr3?J&wƃeLUf] M\j}='"eWE+l rkDQ߫68ۓCDnU_]N=kv,xR8dS?k\_eGb}[e@UUXK=}ŝ_u=BH_]D"2W+VrCz835R'g%:XM]Bn2h X_0dBr}L͈tpi4)NI@ZZuǓ7mxRiXg}vڢVZ(///ѣ>MG&7hy4-p*vm Ǝv_<iatֽ/7ݡ=Z(#4# hֻQh,+ɘxIK2'^؉yIkN^&@ֽ{aQ׫˯ WUU^裏޲eˎ;=W8>irդK~յC5XuuuEheFeln٧ohGŇpUQjkri[lپm[Ϟ=222xIJ5rwV&6ĭx 7;=:'m_h헋9Y=OX(j9~+_ &gh5Y \՟ǿd@r.;vqb޽W]V؂9Ҳǜ۪E~M$u 1W+%/䵙T"F8&O>wZIF׿il)J&B6}jv<bݺv=Â$Mp~2[uU)/FMN۵b UK^,_C8DC.*E)yeڵ;>Y99[&GZ׾|_{j_< X"sC͛ed5(E)JQ";j_4z_ݫOs__[XW#RkcO5MQRte;bEB,|oTI}њrcţ5MQRte@^nv8rWYiE~g闙^[)LQRteF_~e>X5?ڒ6[dWR(E)JёOG&~✎-yn?ټyO2R(E:2!vggƎMm(E)JQ0igM!CoCDR"Ŋ;BnR(Eɑ @,6E)JQRBYl_*GԊ(E)JQ^[TXPTXpکÔ)@8O?[oo:E)JQRt_~o8Ԋ4}CBR2ݻ}3fo~ɢ‚-zt6뫫Y'#7|S$‹nۭ[zmex$mѢe^^PJ !]?HQRIŔ6}sm~͚ո$H@nnn$i嗍ꫯz9hsJ 3^0qpןyw ~HbDuuMNjkz*ԩ&O$3 R_/gt,{>묳vsywΥKB+ƛx~}GHNŋ?ᄒVxqsޭk8>KխD]mmX<#3evb)oRGw.ګHΝ}~wAV|h[qߏ'}7ओjjx2b`FFƧ}ֶMI~0?yՕWu_Yd-7tLcǎM^H>˖-?H6J韢舧% ]u8>QOH}}46u~o֭oQh,7>ԧO)4huۺuk+/}{9v>}J$)&J9E)J/ߍ|޽r?̘0q(8ۻ/vۭ/0 ?wY(xÍMrPQ*(E):|(y(vן*[h1|1_= ?{DMO H { 4{<{윽]z I/ 1 { ;;μG_DMmڴH$DJW&6pQ>|[9{"siݺUPPЌ34Y={>}Zc'NٳGfÆMQrES-[XbTZLwn׮m.ܹwwǺ@ Bŷq[LKff.]gڽӓ-[YsΟ={.=3c_3?ؖ- ݧrr|/O/ssO>y6RD={#nܸy WWK-2ewkmY?{oCǎ?M/ 'NpbnvζTHsg,͹x3oX[~ROa/q̌22]SNLxb1͘Q~=N.31!!*O+[YYY[[/ ^x*za~'O$O:ٷo_'N hfff3g|NѸٹy˖kK|%jb0GNJJ-IppՂK/ՖS FϞ=Bᤉ/_t@Lo#[]YůQğ{w}ۄ7gϫegwn=zhjg\ېurr$ssssU117oP(%ugl~^.)իMI B Dڵkwڽsv,8x~۶4faa&BtL&-萓Y[DBmž"/mC Nw2upxv'&ݱKΞf2~Mv <wkk봴ڵkO"dH$|"P*,^d񢅵j3}ss6mڜpѢyslՒb 6m>>>6mq+vˆ*G˗6!iMCjec;aڌZvvrLvy:U~ IDAT~ChGn]׮]vݚn݋zzz8p@$eeeEE*GFE_阛'kYԷoӧN9}}Ub*FQҾG(Zdϟe2q9>_(uQ96!iUwdmmF1ޒf2֖ ._1c >{ݛc˙^bjٲnn۶رcϝ (A9ѣF1B%YfL"`ٲ׷ljI~h/?UV7FED>48p`Ϟ=--SMU91R&?1 ֝Dzwk:d\J;9#>ܪuP(J߿}}nPN*P(= @OY7'ɂϟ?Ԯ-+Y p]۩p0B?,Ӊaj*V(x*WSP H%xǃY@^.qa0N($%%?A @ =0;nܸ{ 1;rE(fT a@ ̌NC |+mEE 7R%. `0tFt*1r@ Â+'-Kyi߾])n#-[UAKW1LO4mR@ ? ّn]bV%UV[5@ gL /8_0U @ ^mРA)1#ʿoTH1-RBa#y!bAJ}||t^(.%ٸjq\.U@ P(Tu?fʘHE;q_%l$qLJd2Dbgooii qA /:~ 232Tj},j7Uݬn5 v$'dDp_rǷ!~@ &mbyb+Up $1\ [1d2&U>+3,7%l#iۉ>-Hh5Z c\1r׷P(Kh!LHD"$R2*vf{A. x޺ùu+=@O[T1H$J1tYO /afά_3 >P~`HRHXEV2*6rth[ oɡu|8|J48x!(OOϏ?*)@=ݘ膍N4ΰ@ a)֋1# An*(FWj)MFǡj*XR 1N^U(-α<,ߩB)+i@eׯS&On3~u0"a:vLz#ڷiРo>޾%"xyz^vlԨa%Kbm)kL\._yPPC_9syx%oyTHFGvqÉXL!DPvݺА%>|~Kz"E?2#D~L$  {CTIXLitZԥ˖)pرǏ0@cjIYӫW/iK|СK.T&ytd 7 n6Tbʀ&M6]bD"V`(L2  AV-0%7!՚ FDF=+ήָ.]Hh$J̓hj&zu>k,iK|„ 8=vY\۔)Sa/=g۶m;p SaLD޾}g$aIII03FݻwB;;uܩ"ˆ#An\#5T0~„Te-qE'O4yҤR@ 0FK$b*pXBa;Q=z4JUDbp5RTBn&+_j (#d2օ*R>z JL*VDؐ]YXmlC "@Iϟ?֮-!,P(ϟ?dTTjuH>}TTTTzH"g.+(c~ o ) @镅07oXθ6,Ie>*W&"cp KQ#Gˤ_(HH$ }"sN66Rm  Hl6ۜ;rOnƖ@j%%ժfW@ϟ?/Y3%ŽXE5hPl  #[;3 &OA 0BQ6R)6V% N733TP-J A Nz!DOA Xǀ@ c"!n@ @ H`R*ckñBٳ}233njjWYNXr&b1z̘#/X@Κ5ŋ۶z)WW )P(3f._Dܻ{иqc*)@L_Q5kvm̜1F0lݻw[HuiӦG*Q2UjUT*-nݺ!7lp8qqq o|ahжM3g*oܴτ JVV֢E:tТEˉ&޽w7Cdŋ:}JD /.dee5l("{;'?}pѣGDD>bQ%5 Gr%gwli{v{zU _>yҔwݵkכ7܋/N:-,44776u rgΜ9}tzfƶۈpxgV[ׯe˖SO|||||<ֵS|}}%cǎ?>7'w*G׮Ν7lkׯ_vuCI/Ү teCxQQ˗ o߾>rڵk4-66Vw:wݝ9sE ߭u8ȕTLJŮXrE7_yK×zʈj;;/:th@mBbDDQ˷_T>i$ѣoBp„ ~/+W_zapWG-vҲcǎ/Nԩٳg.UdΚ9͛:9vxtTڵ#BݭbXL[,J ^0xBG9NcǷmfe <8a>|W> (BݭH_W&b!eŧA 78+W6S:-=3 w+kJb0,--'O^QF[ޡaF4MG:2]-^x9-ZdX@u\^kW_>qmlmWV-}RعkIѣF!8~Y&8./LJ]֯[vݺݺMeΜ9ϟ?H${"SRR|}}d٣7ߐa%]b*FQҾGFE)v5jC:xxQDRSSerO8ݮVv=sv߾!Vu~+o@)o688{jkdDgM6}}tyi)# 8p T*%? *:5rԨ#BbHpԨQkVn$@w~~  ;w2u򵫥Knذq…gԨQ׮^-KMF~h4*Cc ؏L:庹?^w gΝSLe&Lvj# U׆vlĖ wd g T :ɗ“8@ĩS>sLq>}Ze"A 5̣7LjF1<ȑ#C 1 !(:|=g@ R*cp8P @ HU,@ TT PB R)@ @ H` 31 #?Jr,((f0KLH(8kįL#9jo%/zb *V"`&WB*b&Jr9XC Ο??vb_~p\\]- lxׯ_7nܘEc`{>TFB-b p5ޭr_V"#Hnnnt:]S3_|quuб[7o|qƆJjE[XXPѻݿ/a :Ã6x] q-((zSvN<3bUxEIR@ ),,'%%رc}.5A%|u]vsEAAAw7733 &e *H$bX$Q(P(B!J%iiiRTo;2*[艹;w\~mM[n_ :b1uDΞ9sfzzcǮ\b]^C_wB~3^^^NNNL6<YZwb@"BDB>$H\.0>]\\i4DҖ)T@eJXIRc[7b5 YUNlRYfk<=tذf11~U>E$/TD˖. ke4;B( `欙]vlD F)!ӞݻFP9!'/bT*t:](  8yyyt:Ņ`x! !%%yn.NC VmZrto|A"Pѱl߶ͯQZ[^zը;WիEEnnn+Vܥsׯ]+S:ϟ= ^P-[Sglz.g͚)@TB e%??q.֬Y#@ 4qdz2yP( JT,5PmQr`i7K~ nڸի7oz>N\‚}]"¿kiip /}sϞ=͝KD1|)S'}x}ݺug:mE';OxϞ?yVs+C^fɓ /? 4saAۀϞ/"beJJ:.޻KnwU*"P!H ^d0^~Gh&ˣD"wTT[cU$J H$T,52f͚m۾<|б'˖kfڵGby͚Ē3f_wC–kZ323s7mڬ!""GvϞ=6n8.&>|"E>HPhUbz:vrer<*:֖{e@KC2D!}vWȨQF>\=ѣG2&Oc6|aEYy\O._xݻwT*YfAAA:FRY%4NMOOoݪ%XCL,m8p`TdDnN[7onذ0I`0d2ɓ+WyZ 4.׭[f9;*:[*ݶuСCU\L*qǧ E>8:fUۃ=񮓛;q.+Gq]\\;YYYľƆьTWީ޹4hp@@@```nn'nݺկzYbK$cH$d&.K|xʳ{֬ķ*Vs޷3W'E:Yxqwpׯo߾)&hlHHUҩse+V/qX,ֈ#ڶmڵJ#Hĕ~MaP(,,,JKKIIIo޼;+ IDATׯ_}ݍ7^tǎ{1·oX,31UE0yc켹sdwoN8>b<%ֆH$t:הyj3iĤ$TLcsСM6 D}Xq___:.Ұ윜P,qm 2֭]Wקe.]U?$%}"bq=jD"H B(JPX,adR(KKK2Ҽyswwwggg///"GGGL ^1Te͚=;yv۟=wׯ[g.&>[MDx7m$1!q]*2A̓Zj߸%K@m N{mlo߽wttlӦz%K/Yxֿ7o ]xLhU׆vl` ;3BH$0L& bP@pҥT*ڱccv7qNO<0|RlP]|ۛBTT&9.\dmm}А%O[zŋٳ{~S&NCđJ>|`2?n<w3g9d۷F1b>eI22 ϝ@r2 H@6mTa!,Y] čld=}-P$ʆfϝ7:tTw T,b;v;+>UּQ*V82,[YݜuERE4L~ V-cVXXH-T,1sX.cF^yńrt߿߽{wC/\V1"\N uO-D2]9)3qW\Vq!|-ξ36 `cO٘_{̗I$PR$7LlSPe%;C9dt0g*~_i_ƸV. {OSNCg~D? !G$LU*`0&M /ѻU*:^y1TQ͆iP˛6mӠ;wŎݼtYxTnQ*[eK0sN:}XGwgֶ'5 71>@ $''gdd|9==%@pr2<8,BNRNiU+~U#He9NW8g?<<~:yD.7!!Kjɓ.]:k,QY*dV/m bժUAF6|Đ:hР{N]-B08zoWU!a%}sO`P#ZPvS ĕe}il4|Sy 8{5i $2lMbA-Rإ1qS1otX _ SPt:NSTkkk6mkkK F&銹ZhD/6ɜ&V5%j]z*0m@ÇbVvtt433[,?hӦ NgaaKoݺ8}EL&sA``b&cVeXfɜ>cƛ7oJT72ڊʆj ZhbэFB1ɋU,GPʢ qQ_Ǘ}Tڍ]h.@gʝO"L.oA[$->*$NXa!H>-jBUW;fIb7|wkMq*RT2,h4\.g0ӝ{a^g(gwt;M:PX%"H$ڷwҰ\W<LL&mI1&/ T/%rK*A.{ }({M+h k&is?\ib@P}RëJy 5ٳgG\qmDe֬뙩JSI K&O!:`T3eT `\s 30-,n2R9>F7)l"bbѴ䵭ɪ)nPZs|>O&<&''׭[WU% fώ߯_FFFݺu͛OGagN.{A`f7mZ''y莯g*%V-u̔S+k$DыM.ŝђ/|6Ǣ4! zdil^~z;A<#R`ΚEJ͓WjŪozbUWܼĄDX8+b|}}tNЩ<zݕ=1=dhJ 踗'_NL5?w* b@>&ONI[؟(J"]O^n޼y8p1y>;8:nkk֭#&R˿gC  {eV Ln+)3ٗI ?嫗[Q3IxE~~U\3 (!6PLbN Whh˅'beeGtXkL**h DIұbn^Kr~Uu%,~NHߤ Ji&~khyc5J*a/rdv_ rU^#'+*~@"3 $=YP1p8EKIz>}xyzU0;ٔ!DhriV˧G:O,+Ύz2]7k42ڳ?jVL&N)7t:b鈐3kcǏ_tɀRR5rӯ[j4HM/4ҎJ iQdFG钤_]>{?|XnH,|P$"l-_|5tauLaNl1r\JM; 'Baa؞={0 H5b Gl^g**mb]GٙaUXmV9;px޽[۟LSEDTT5kV'g_AltTTFzƓl@DP?aP f@b;GPT覆m\c)(J)kP_դ ^0 ܄3339ҡCG\^I.הޛmVuxHUV]]Ο?ׯ_{Fѳ'N0LWWU@rȮ\.Ww2...r'm֡Cjԯ!)"mXOPҦ.k.!) C³lXY'M\ݸ~}𠁕(eB[U{UFfVfCL& fsssE>};>mcڋ͢ŋ_|-%%EOI8ׯ_Xpe}x*GΟ?{-__A",3GBU,z`hQb*SUh.lM4U;cv=Ϛ4y ^yӠ~F }w5uJ*oRUeP(LOO_@&M)>l؃bqnNƍ|}}!C.Y(-- ,,T`_ÕY:`r'x?ڴini XLfnn9v'Μ>us]矋/_bt;S.>Sjb2H$\t̙ӧO:s4=s3\ziRR SUI7ڵa7S,Gsο?ICUSP[uwst_Mw2:/%9eYxOwv9JEQ"(r(>XJ$RH,tةN#RNr~C]rY"rlmhTAD61`vEz9Up" _|yӦM^u}ԿsAAܺYlÇ  ;w"/X^j{PA_mz{H$R;wOyvCXm(zb}333سYhk6k֬upp`2gx@*¤߽{'ɒ̜1w>ƖȤ"ك:YSG1+±NrFPòAsZR#{J)꿳w>+'tb|9㙙HʧL.{WӫW)S&HJp8}=44-[~PqK#'L"H0NbX}_r#@ue1D}=[9Ƭ2^IߪWY/K888o߶miB?cccuGW˗/ '<^MWG LF[k>}R,Ljԁb㏙n\,HRD"J2G\.2\L&Jar\,8frLWhyaÇ7޾Ց!Cb222222b 57 b,-S^!5 \kGjlG)& IDATk|uBB%d2Br9(((|0APAѬ^+0jP&߫ 4\zuHH(D"QA'T1c j޺U֭Zhrȑ/Lz{,dJW(q*ZA!V|1"E"E3% EEE666 APrX"u*"BVTN9s̙|sZ"k[^ H˗[rH塨 ݼuK>v8bfJk-H5)eXjoZWDRoߺD"J8^XX(JTb EѣG]ޒiխ@ 5L|Ab<B)C TlSu8\ 1RW77J&~;d2}vv þ|Bnq B@j&$23{A?FSׯ"mB" b ]Rc'Sp\.!T EQUN6m#ATD \]\֭Kݽ{ݻwf,8@  $uL ?_pP)d&bʣq9) rI6={,A0 c2u== $`rbq[njj*=wM&lV,_c6dI#-@ә L& %s : T"K$g'"W'8m-KI@: )ёεkh4B$br,XZZz{{8hq 1\= R*b+| FFeVYRa{VԯJ#""8fjb˃ A*J3В(A(D"J?N/.V7Gqwwd0J"t:bD"5hUA Uܹs.\p…s*a?Ƭ_Lh1PO*6(ʚիՋ`8;;6u')jq>7_)I 666bD(2bUL&xXiFa&H f2izIP /6===44;wBQ@@Y3vebjׯӠK׮o4P2PE;OX:w?v8ըAH$K sq/ET*bҀѩU W5;sA_ĉ^‚g쟕b*6nsssS޻X4,8x]- TNu (Ffxm6#eQ(AdbX@vK CFQf2iU>DН/[#2ϟ= ^P-[SիF }wء(Ν6o\X\>Ij[&| +++++׮^5Da"bPͭ bݽ{ yԴ, D",%]uի.X}"__Dʔd]ze׬4yrxtTTFzƓ߫gOw7}]qhϞ=;ouɨh[[[ԩ喤fy>lxxeK*iPRyT[ldfiXVWv/F@bqbIřwÊiʡ_>th /~Ӧܜ؉_t8m֡CrbrrKR<1[균fBs.6l4Di=zzmc0vYj~Nj ,aBP(*>j*DV~ǟI|b}/B%Ꙉ݋222,n66/V Ϟ=eu)ׯ~JJ%)GdѢII~KݻwN\#P~XW[lA*VʩkSoΣ/8 X,e2B:oL&ʸ:R-[>TÆ=xp_,lܸWq:i&~/4$$;;;;;;$dI+.IEC zճU[)yzzZ]Q;miv9|>/HpWhVT*HbD"H$2 o8jL}/րTpc U/v츱11M6ILHܹkQ{{?0N-N`&Mۇ깶=VPD tCSU׆tmlUgfNm뜘awzB&d'=0E|r'ow}(:eʔf͚*V,8NZ")*'u@2iBcOIrq:b~ͭ^:@-߽MIIS/Dq㺹9JEQ{o<^X"i߾1PP_* P*z5(l^'I(61 GGǢ"&I/˙L&ˍxiY@ov!]Gj;xwxQC)VOpn'k!a|>7 G?J=Y{xFy1&/aP&BHonBs8}ߕL/^toZFߡ4_qLFLb'jx;670Yט+k5{RXR]q#7}l豨͛g: T2!ٛןL_I,a @Y2\<iL&[bcpz|%K"?½FG n=6m2-Lghac21&5P!;z666Nj3g6=W\>"uu @Sԉ_Qܬ K zKU@K6m8s,]G꠱NQ:5(,5B @#:sCuP9B /Mx0(,Tנ{7%w nY@$9w5B.3v䏻waPX@ X^T2`֐B:fGF\X#~[bB-e}W@4fUlFMahPTblᾦ<LI g\{T?[+6b?iR;^#ly>8 9BON>̿"muR75?[0cg6#|lWsDGc W_2jNoC)muqfg_ϼRn46iVJ4^w8ULFgB<B'Uȉzͥ-oJBV&ݴ$I|Ɠ'i:ί!w}6nH]MY}YQuꅯ^Zp۷Bk׭[PkݝAUm/JLP^$Qn*Q U\$Cp!h8}d|7wB}7^E ř4qb'Ю];'Ot5:ZA:hЭ'A!R\؊ec&,W4N>?Ihǟ] 64/_\sZh];w:"P7 ̎DukBc?*P.Y!B _3 1E$Y!kc@k'Uv÷!9mН'K$Pr$W,_ҦKU+W6 }۶u[aaaAA֭[>W:>2v3ȯá[bikX~0F] zƒBnI@]˟D(.CPlK#?nÇa;4:p@u"/yQ (K>y49N_e:rU|;u}fXI:~^|z*4tA܌16<=߸!<# @C 1|ĈiӦ#vgϞ!If84# @]ٻ7MOܾgM=29gcDT10*UϿ7^#GHrY}1#8fta f  Z񍟁0`c| x,*\2F*T(* };w>77=zxzz:vmٶm뒥zpoAi)4$*W_]M{ve!*8jʶv'OQ zY++_UMes`޼Ϟ=SO&-YҦ];ڪW@ӧO4"z!:TU(+,zh t|މb d[.5á:88Xؘzٹbk R_5u*ܹsg֭kȼs7$3Yp{)sKTԣGFG/^h7lPS_:2+ٻ}9b҉bz\t7_dΝ!!}Y | u4UKG"t!}8_}ILI[iepNH@Zء4Ǫl$B7^z@NӘiϘs9%[$"Sx{[܆uU/?ygRêY6!ؕ+WUϗG>q~K.t2KtelcG$??zɡǑuttɩ)++I$BA2kddԎ2[](}!<ԺQ|V\ס0NRS,p3?$/^ķm{qI>^W4ՇkgiתUqiq,3&,|@s؋}|}f> _nTйs+W>\H$JIIΓ'''S!%J|>B(77֠,--xںF(.WgGoA wL՗RھJE$'54S]lPӷ˝gqƎ5,//5+΃ BxB3sZZè#q<9b»wg2+/+ b>~h|g^bk***̚5*<((<,L,ⰰAC+عcT*Ș7on7>4$$)\.ɓ*5lfffffՑ_ϏLLLp mr-cerNoܼeohfsСmráװnnnb 55ݽrVSSEJNDFr MUц]Dmݲe/_ 26<FD?~fj5O>O>U*x[nۺuRh o@ cΜ9sQjG7 eVռtyHhhHh(]^pCL :8\bzN Jx)8'Nخ\Y>u*d"LD"Aq8Pqqqvvv6mrss :&&&l6;==ٙȽ{|}9}g)PR-{[n@rҟ{~Ӧ⒒sss(V$#=zTTTdccRRRҾ}{\^\\L˜̊oVb$Q&Ko/rҟfD$U)!X3++ZM6j.10:@X,6iޚrҟUZZ[PPлwoU?0.\`nn^TTr|>JNe_|'/ IDAT#|ZR9߀kBoJ5d JSPb_|IDΝ={!RP([noײcS]ptz:АLNľs-If{zy%LP?;a8AmfQR*@7_Zܡ'x<OL[MX“}+xzyzuyEy~a00>PhG4]@G]Rrҟd2۶kNMdL&x<!dllL+ TR#7@$*,#_3e >Vut[<,co6#n\~u-w"4cc|8 6{-!%élT# L%%%('۩uk'ra10e0̬&LJrҟ9*q~ 7%qcԯELyX{vXwuM6"U/J#sJ޽;E w!cWLi7*j"WZZAqZ/REו.R9Fá2*MC}p) rbz`T=45!.AIy7Sb`hD^o.bS.HѦ##,[1v{X ,.S+ey?7{eF\E.+8z?̯ͬ5.j;!\s>m;4)GuaY1sɧeW[|ht BiBQCvPwyS.bQӟ6g.8?X^Ձ4˂sq҉G&M/yiw'6Y>ItwbTiAJO+\K5.j3ςN.܅Ow38t̯K/ :'j:Ptc ;-++&\rOO 9l*]W~NnѦ!{o*2 -Rt+ '>. JJ !jHlAZ; YX\N xR2ۀ*/&\ԊMd;+hxw]#@2\@Y9jh]GjXK :7zT,ꌹs̭A!R&5֒3capq<.B}֖B.USj)6o>BȘڡUh35 BʨR1. i5ǰ!nJߦn8qbࠁ.-VC}p)X􃸉+=3zh#?.*+ΖNU{oˤm U'Ttw"s*B8A܈@5K#wU-z#ӄL|eB~=⯤DD" <~ٳg[=R* *hN{;]l^^]:>6A}ˇ q`K⊦ԢnoƘLq9,LV&t9N' nw 7!ކ,aG>6UL?|&hofb!ֱ+Lcfk@ HtUj#h mPb^~blGc zAq]RRc``.֗jrG˝NIa"ʯ<,~ԃ\ŚU|"t/)3jg̫W5(MՂ^/W9j.ի%NNNSNuwrvaE}Q?/@w(I%%%~~~=ruu-((`2/d23fDyyy#GTՔɓ'u&l Fc3+<&YZQ矂YrKzp\؂per.P۫ѣG/nmi`gŰa'a=80"kJR,OOOgIII&&& JիYKOL,r0gsu/=^4 *6E7`Ԩk׶m~^BLJ2 .[}p *MCOq<%%`'&-8`!tqu}oL!5,Fg5iIh0{^nnm (**q.@`҇;udP\s5BXpoֺ4{.(PE%ƋUUJ;>XJ΅PbURB$k+K/OI&>}DYTtI&V/8q¡Ckm9##c„.mZ 8.:K>Xre4 ~@rĒ/_5ϩW҈#oļMIQ,|r֭#j`{IN1nIz8lk pAś$o߾M{EztEa0VVV&O^hBW\vIH t$''}=z͈b17n*6gq(ؽݛ`H$pݺuT-n>mzЇW._qwk+_U֭ɓ'Ս~<$dNkgN!!ª~S:~'K@cǎ8i{jy)V*:9:'Gdm4h;w-QQ=<>X\Q~m|‹...K""B&L8yDaau'O0a&KСʕ+4Yƍ/u```hHU8} %%'9{.^l˚8qmۨ]hSN_Zyn;wSR׬^~qj7-QQ[?JB?>u۶dd KP-/^'uÒpZ*@PX5Б#׬]gccӪUK;wV7{񌍍#"DGG#߼:tpРN ?pd``ĉ ׸  f?yRyX2bݖ-[k\s.]hfnn'OD^- E"њ5k]USSiO8!sΫW"믽{"&ObhhТ5Rߏ#BǏ˩SBqn7nܠ_ݻgUѾ]hHHQQ 7%b˖->,}:vETݓ"4$Nq)]O-H$&&tFFݻYYZXZڷk[fw80^$8V~G;m~Q.d~q.j˖Oݻw~rՕS2^rjzע{wEU4y͛ׯ[osrriGGGzUSSi1C055ݺ}osNSS/rnh(I5J9A4RlnnntU6g^&yꕼ2?jڟ0gl<;;蔷?|(,lqƷmj!IJ4xpdm*/ٸq?7)oS'Mև={kWjGYY99bIvr8q¤<~D󜝝O>u:8;;#X,T**"=|PT9|H|‹ҧsٳgyyYYYY@^"(ꊭdP~qu q5?37o:8:0`HI 'QXԕwbϜC&ͭg@L&;s -644ׯBH%Kz{{s#G"{ݺsid;Bh] r:uJ@lݶ$"!C+ԹK:wBDmr…N+$hkViܩ_ӸuA5?8:دX|=u PxxBԹ_N~VVVaa[_KH(*,5{'~< ?Qfhu†{D/ocMo8@AghƊ@s>NbvC;;; SOYYYG~W8٢@FMwJOO{"++ӣB;x={/222<O+~kNZZP(бK!2+n'b[[[5ulIaA\.@#R}a3iIPx\hz4:%ݣĉ$I zL|ɓ'O?yKyظ|5 1bKT]-^kNИ1/Em޼g lV͊T*`D"^++5Jڮ͖djhj/l&mbSũS'?>}E R̂ cwﲲZh9s͛o-""|>(.)aZ&!\n``иP}a3i6v(͵Dqq7I: @t:Q #42'33tMC:"Z XMw Цӧg[^T* g55rȑ#kCi΃V(c zR,IIʤ5Ng ꭼgϞ 0 #I__CCCMMM9 )V?OrsByyDީn/0S,4}N=Pz-DZ2[K+z:-+ bS4kr,-+I^#& ۪U6..5p !TX@4q<>(b|r_R,-d2B&/ $}N8eec٪X&S1`sJ$Y򥪣X>_s),(Hzcǎ;v|WZukl@9dffsݪ(J @9žyӧ^uv4e0>4|$s3!_!P ww9nڼ)j&5oy(}Nht],:BS @KKʬ~jkiJoLk]@|@V?!x{}/w}>X#WSľ2?3W構(FԡmZV桂ú^Rb RRBB%bŭm;]݋ؚ^/^6bk\5=ISN޻w_jqГ hf>:ϟvT]199Xn݀!.yQױ4s͟7!q@]@G4&SSӛ1n255U, Λ`oWZZZE̡CBԺP ƏiFrU̟7С<4oniq_}4A_d}kShA3G4?s =pP>300׬YЩZy%>fּ}@QiquZ222tOxzud]ױhi)IO?8paQmI{F]oM0h&ޫ7lUh>{```Cx?/^ҰUuj|M_ahXhW_*u]Fɢuh2MqX$K CX!y|B`` PPp~_6V>}RU۷k`o7k̊q|ʕml'OT\\\cx3ڷkcv0000""ѣlmlF[˗{|קVWįjV_|7hجGL6'I}l߱se%,?y-۷>thǎiRz/)VGFffd޹{Դ5Woau _]1|,X84(СCT}}}BaYv]7_3АMVs37?xvZpKTԣGFG?Ox+/Wšk$b.=joOx<>eIDD:} %%'9{.^KJ}I6n155pfjڿ1+#B(0  熆ROqҢc͛qW1%%co| fs,{Լ6VVbqI{v -Dچ̙SXXHsသ=m<=:X=WDqƍkogkgk/^BWt#j"Њ|ŨLϝ{XKO?铓XѤӣWD/O{{y&&&*E"߿O$%$ys~>l:xРAK*ҰmU+ MR##Wm۶M~FFF矧.]lyf}{JtREEE~!B(;;蔷?|(,l1͞=G׮ٳz)Sbcc~e⫐}!唎wUEC~~Sع999ԴcNNYYYt}Ew9rOUSN>gϞ!IP,ꙙQ|>_.k2 Φ322>BԾ]['EFW;::؋{w;`kѽzv?PM}I6n&͖R@ @I]8xBh<oC(yrrҪU3gR?˨ѣB+B?ВK\#BU{nPHHd.:qT', ð>˯*d2IbR)5H$JII鄭jvKK9{?D͘޽wvܙi21Hͼ }V$+̬$;G]'B'N4qғq9oHlB}||9bë&ڸVM-X*L)P&}9.Q5K>XZZ8~"///::Ҳw:!B IDAT>[b h!ZYZ v4CCh05Ѿ>;wtyU5D@hh!Cz쩦;RiFFƼysrDAAaabX,-:T#F\hazzzAAADD8]nccs#oٲ*c٫V>|DVEB5f%X"GE>nА7rg'ORС_PwWqy<7[ɓd2IrWWįjZZ7htbϞ9۷!DNVyyy_]VV~&9|D`#F2LФo݊ioSB_6oSPL:eKdҤ7 WUSM$@믡!!ԅCNԖ-.\h8=3?ӛ!u׹UXX_|lheeǙ;J`ƌत7ݻwW"JZ&}:v477[Ygw:4(n)iqXIz|ܽVgmK""?2Ŀ@qcqt_|{&ڸVi@ [^ƚf䁂 /ΒѾ/ iaas-ZhiiŋԷDE\x]v*xرi?P3KbbG]+[i!ԮX,>{ڵkك+a߾ŋo֭,+*j+UWbǍf9O>S;;!ڴv.,,wщjAM$[y5QS'+'GGaX@;x@rRrkH(h\a} Nj))mZG; MF5ݭ',DB>ogg7asз[`!~l]VVV-=GNlÇϕH,X$"2rY\\\:wrΝ.T~E}E ~8id>o߾ j_bwuewϛ7ӦPUU Mp'Nu @SZ8 bAzͤIlH(Vg} ZQ,@OVk>4sQ-hX@+ Z) Cx&GV@R,b hX@+ Z) HV@R,b hX@+ Z) HV@R,b hX@+ Z) HV@R,b hX@+ Z)V?y<u`8܆)V?KR tHAHR@АFX hV|>(.)a`@rӐFWoq\nNqh8Q hX@+ Z) HV@R,b hX@+ Z) HV@R,uNnt6Bz.w3M]d_zbƻ޶lm{&{Go@Ԣ)%UplGRmV\]uN!goI^ HV@R,܉$I I3aT)BCDDDdKb$]#1#fŨʧa S UU.ݫHaf#yUrV߯QLc$IU=CuF$彋jQ$Aj.LnU)<%VKB, $Uu0D2Tbyq [=Qq^F T)VR0èU{aPf] \V$V++}u V6G?\V&//Vvр7͜⟕=!|O ?k{JԖj^k{ *T׬9hnjaTUU>I ߒZ) HV@R,!D$2l&ɏ^iwОM 5S+8nkgoffV@^^n۷,Rii@{ސvff溎rsR5Z5tv*Rq-q{O0@W+ѤӀ{C- iddTݭ]C稤IQ[\\rQg.^wCR4|]ԩB /ہ`j͜& )K4zC6r77Y7SKDaaH(JK5K}>Yt:I71ww(YyH$zgdd`(_zV׮F%$$tC$`0TuCsFΝ}uNS7d"+hM4gB"_0>IV06ٹQ׮|'ŖUdfM4Ayq tZ8,F@r@^75Afl׮݌Q=Bs-2ruu\]\^&&{B2 ujIXBdyYk?774ێ; hO=ސjg圽tcоF !8 4FZn|0ƈojhѢiӦڵkݺuԣǞ/]jcջw+KK ÊsrıWuXnpëU+l6g%...n!9 fh//ϒGo%\3o[Sr46`~,!$RT%/_Ykꔩ%KkÇյܠj6f]Md2BQGGa,5JR-f֭[ڛ5kVF4;hv4C嬨>} OZUՌadGG ?.]֭Gŭ]rNགྷF \U\]] ??%K:;9cqSL9b1EG..iI=vI6cp ^+IK.m̽Ύ"D WeQTA.m :O>Y$¥M*lmDjSC~Sr905e $)l Opd!֌LLΟ?? 0Pq鴰p]{߫/NI|k|~+S!vsrs,lOdVy`To0(h趭RSSm´ 7R5􆖶#htuKmW{wlW.'/ˎE5|aXXQ~~>=77t:t@ݿwo6Gy{{7ʛkŏC#gd_0T)U_|`hȜNc7cbPU؊QMvNDr2=}CP,'ZZ|e>}T1~~۱}L^Q8hAB/^棦!ʃZ!D8e36>}7ʔif*[@h…[*~$"ɷ))NڱCO'J$ux"zƊp__MU$>{'<6n9gΜbE z{y}ԵIF?-ׁˇ{ׂ |wy:=311~V|{E?٫׽c֯[~W&H~?l76E%$BY6Rd-$aCMعMR}ڏ^@U6}%$o-W(,Hc**gEajPkS;zuq>| Dh…fͺ#Gݏ˾@z(`ff֯o?ŮgfffƏd$/!Iq4?FFaݾlRK >7qϟvS'OX\q6Nl?z᎗cQQU싷K~?|rW6\.+3+'5%WIU &ScBͶdɒUvvv~5H燇f~ɽTIm,rǰCsedaI1VvP}x[^<~qZּi.9oLDabqv"5Y4gנ܌Ioިo'%%y[nي+x"s33rs%kU+ksjD2b<]2cOK x ØGMk$B#v޳`TlܴY3ZэڒUbH$vvԴD"!8h͛ssF^+IB$IA,閩-kD M$R^&# Pif|aR\R2!Ef< fу+lg{1Hjlp܄Ǎ;vI$Bvv^^4`@۷-&ɡ{R)UrnGegg/_b=l6S'm ZL2W{sQӔq~Ay彄 +V 4Xw7zq3ǣ,qO^~3+K^Bݍ82oꛊOH*ԺTjԔ#1bKr_ΜKߦxdLnɧ6[_8/`i`yk׭337W&P,[m߾k;v իRFi(D!esZyƜ{I1UH51n+W.%s=jXRaTj:=-M P.O}QϞN0 Kӹ'RSmf0 ۶qKÇ9rdV˕4wOMQb.BH(Qb ~X6=-kΒ;JJ4j͊5D(!Q>/y^Q6lrser”))aaa99\3ZgΘΕZ*!1a47mJ+<7yqzId|&_>Tqǎ[ˏwIȢ[c֑z>.6vj5%ҔHV-OOJ׭]z*c”cǹ~aExhaAaͻו`x,Xv϶"~l8:6TH1*iq|U[m+:-1xkQQQF ,b'R YjȺ 23sdYj;TZ~ w֭EǏH6瞛9s~2+SS8cb9:]>#5⡢OW6gjܷNԌB-Ĩ9:-|x._ܯ{wOn.cA,; '&$~m׮;p\2w|Lr+lk׮[b6l/iU7^v#ipA2Y͎B"3ܬ-Ҏu/|8$I E###lWQ,p/??{Dž"'jz,};S?MnΡCM^~948}'eWZ-MzyLkὄ[~]?YN V$ (BRej+ۘsk59݉!K8BH"B1C*?"C?~Î:<+3j)!β7HJYɉo-]I {?z?o,5aE&fAvS5O+a>Nv't +ĬR{t[bKGJV/S6fXB8BdSp Jկvh$+H6j bG;[᲏>N_::IDATWJ%^yձcÝ% Ν1ыBð-[*.Ƿƻyws}W D8qZmTr[.65 p?.4F@'g04`X 4}oe2T,a+ϫ6t:hh /C\n?Tx?ُHRc &8q7jXb(jPZ_r/0 $$} WbGh p~ V!$61qBC{cU~XPoo^o6eʔHe 8 55rYDDXb#}T*!> >9ܱX_Xa4[nlmm5 T* .J] Oh pFnc;  $DŽfBEI$<|Q'48#ABw`cgcFӴ;pq7ډgh pFh ǜA}ƻ!Qʃ $+p4 b)b)b)b)b2L0~c2.]Ẍb@izj| KNutClient'> ]> The KNutClient Handbook Daniel Prynych

Daniel@prynych.cz
2001 2002 2003 2004 2006 2007 2008 2009 2010 2011 2012 2013 Daniel Prynych &FDLNotice; 09/12/2010 0.13.05 &knutclient; is GUI client for UPS system NUT. This document describes &knutclient; version 1.0.5 KDE kdeutils KNutClient NUT UPS Introduction The &knutclient; is the application that watches state of UPS for system NUT. Using KNutClient Main window &knutclient; Main window applications &knutclient; The &knutclient; is the client graphics application for system NUT "Network Ups Tools". It enables to watch the state of UPS and to show values of variables which the choice UPS a its driver are supporting. From version 0.6.0 &knutclient; supports the running of instant command and enables the change of RW variables. From version 0.9.0 &knutclient; doesn't support protocol UDP. Main window &knutclient; Main window is divided in two parts. The left part "Main panel" includes next dates which show the state of the UPS choice. On line, on battery, overload,replace battery,battery low, calibration,runtime. There are unchangeable dates in this panel, name of UPS, serial number, manufactured. This dates are reading only once, when you UPS choose. The right part includes analog panels. These panels show values of variables like input voltage, load UPS, battery charge, UPS temperature, battery voltage. &knutclient; includes toolbar, with standard buttons and button for the UPS choice. &knutclient; and KDE panel &knutclient; and KDE panel From 0.8.0 version &knutclient; docks in KDE panel. His icon is variable and shows information about UPS load, runtime and the charge of battery, depending on type of icons is selected. After moving the pointer of the mouse on the icon, information window "ToolTip" is showes up, which includes more information about UPS, Name, UPS name ,Address, State, Runtime .. More KNutClient features For connecting with server side of NUT (upsd), &knutclient; uses protocol TCP. When UPS is selected in toolbar, &knutclient; tries to read the data. When reading fails, reading is repeated. The maximum count of repetitions is five. Afterwards &knutclient; reads data in periodical sequences. The first reading reads all variables, next reading reads variables that analog panels, RUNTIME a state of UPS show only. Variables show UPS name, manufacturer, serial number ... are read only once, because their changes aren't probable. Errors which arise like answer from user actions are show in their own window. Command Reference The main KNutClient window The File Menu File Showing Ups variables and commands Shows Ups variables for selected Ups File Running instant command Runs selected instant command for selected UPS File Setting RW variables Changes selected UPS RW variable Ctrlq File Quit Quits program Menu Connection F1 Connection Reconnect Restore connection (reconnect) to UPS server(upsd). Menu Settings Settings Show Toolbar Shows/Hides toolbar. Settings Show Statusbar Shows/Hides statusbar. Settings Configure Shortcuts... Opens dialog panels for configuration key/action associations. Settings Configure &knutclient; Opens main configuration dialog panels. Settings Using description Shows/Hides description showing for UPS variables and commands. Icon in KDE panel Menu of KDE panel's icon Menu UPS Using for select Ups. Showing Ups variables and commands Shows Ups variables for selected Ups. Running instant command Runs selected instant command for selected UPS. Setting RW variables Changes selected UPS RW variable. Reconnect Restore connection (reconnect) to UPS server(upsd). Setting &knutclient; Opens configuration dialog panels. About &knutclient; Shows information about aplication &knutclient;. Minimalize Closes main window. Quit Quits program. Showing variables This window shows list of all variables and instant commands, when exist for selected UPS. Window of variables and instant commands Instant commands Instant commands run in UPS, the NUT server puts the command selected driver and driver will run the command in UPS. The control window offers commands, which the driver supports. OK The button OK runs the selected commands. Cancel The Button Cancel closes the window. Command The command for running is selected here. User changed (RW) variables User changed variables are group of variables which can be changed by the user. Majority of them are equal to setting of UPS. There are two types of user changed variables, char or enumerated variables. Char variables are a string of chars with maximal length. Enumerated variables are a list of right values for setting these variables. User changed variable is not changed on server NUT (upsd) but the server puts command for change to driver, it changes the setting immediately. This activity is not instant and it can wait a few seconds. OK ButtonOK changes variable. Cancel Button Cancel close window. Default Button Default sets default values this variable. Variable Variable for changed is selected here. Value Values for selected variable are selected here. Array for changed of value is changes on base type of variable. Setting &knutclient; The window for setting has got five parts Setting, UPS, Panel, Fonts and Analog. Setting Part Setting is used for setting number of rows, analog panels, background color of the main window, input voltage (120/230)V, frequency of input voltage (50/60)Hz and allowing of input.transfer's values (input.transfer.low and input.transfer.high) &knutclient; Number of columns This sets the maximum number of columns for analog panels Use custom background color This allows to use the custom background color of the main window. Color of Background This selects the background color. Use dialog "Are you sure" This switches on dialog "Are you sure" when you want to end the program. When you don't acknowledge dialog "Are you sure", program doesn't stop. Use Main window when program started Sets showing main window, when program started. Show message window, when program reports error Permits showing message window, what shows description of error. It's useful when docking of program isn't forbided. Nominal Input Voltage This selects nominal input (output) voltage from 230V or 120V. The selection isn't useless of "Use High-Low input.transfer values" is switched on. Nominal Input Frequency This selects nominal input (output) frequency from 50Hz or 60Hz. The selection isn't useless of"Use High-Low input.transfer values" is switched on. Use High-Low input.transfer values This sets nominal input (output) voltage and nominal input (output) frequency on based values in variables of NUT input.transfer.low (LOWXFER) and input.transfer.high (HIGHXFER) These variables determine the range of value input voltage, which UPS can work with. On the basis of thise values &knutclient; sets voltage and frequency for analog panels which use them. These panels are input voltage, output voltage, input frequency, output frequency and etc. UPS The part UPS is used for setting the list of UPS and their parameters The left part includes list of UPS. The right part includes buttons for adding, changed parameters and deleting the record of UPS. &knutclient; Add This adds into the list another UPS and sets its parameters. Change This changes parametric selected UPS. Delete This deletes UPS from list. Setting of parameters This windows is used for setting parameters of UPS. Name This sets the name of UPS for the &knutclient; program. UPS address This sets name of PC. UPS is connected with this PC. This name is UPS address on net. Examples: ns.alo.cz, localhost, 192.168.1.12. UPS name This sets name of UPS as it is defined in NUT. When name is not defined program uses the first name of NUT system list on this PC. This is true when minimal version of upsd is 1.3. Look into NUT documentacion. Examples: victron, myups, apc700. Delay (ms) This sets the interval between two transmitions of data (reading data) from the NUT system. Password This sets the password for the authorization of the user. Store NUT password in configuration file When you select this selection, the password will be saved into the configuration file. Password saved in configuration file not crypt. When you don't select this selection, the password will be forgotten, when the program is ended. UPS Variables This selects variables which will show in analog panels in the right part main window. Parameters User Name and Password are used for instant command or change of RW variables only. For watching the state of UPS the User name and the Password aren't needed. The Password and The User name have got their equivalents in file upsd.users of the NUT system. Panel The part Panel is used for selecting which information's parts of the main panel will show. &knutclient; Overloading Shows/Hides showing overloading UPS Battery low Shows/Hides showing battery low. Replace battery Shows/Hides showing that battery needs to be replaced Ups calibration Shows/Hides showing UPS calibration. Manufac. + Model Shows/Hides showing Manufacturer and Model of UPS Manufacturer Shows/Hides showing Manufacturer of UPS. Model Shows/Hides showing Model of UPS. Serial Shows/Hides showing serial number. Firm. rev. Shows/Hides showing firmware's revision. Runtime Shows/Hides show the time of the runtime on battery without power. Use custom background color This allows to use the custom background color of the main panel. Color of background This selects the background color. Fonts The part Fonts is used for selecting used fonts. &knutclient; Use custom font Shows/Hides allows to select custom fonts for the main panel and the analog panels. Main panel / Analog panels This selects the panel for which the font is selected. Font This selects the font for the selection panel. This is used when select Use custom font is selected. Analog The part Analog is used for setting color for the analog panels. &knutclient; Use custom background color This allows to use custom background color for the analog panel. Color of background This selects the background color of analog panel. Use custom other colors This allows to select custom color of the analog panel's other parts. Color of pointer This is used for selecting the color of analog panel's pointer (finger). Default color is black. Color of OK range This is used for selecting color of range OK for analog panel. Default color is green. Color of warning range This is used for selecting color of range warning for analog panel. Default color is yellow. Color of error range This is used for selecting color of range error for analog panel. Default color is red. Color of scale This is used for selecting color of scale for analog panel. Default color is black. Color of font This is used for selecting color of font for analog panel. Default color is black. Digital processing of pointers This is used for selecting type of graphics proccessing of pointers. Docking The part DOCK is used for setting parameters of docking program. &knutclient; Type of dock's showing (Dock is KDE panel). Picture Sets picture type of icon. General Sets general type of icon, for specialist only. Items of ToolTip. (ToolTip is bubble help.) Manufacturer Shows/Hides showing Manufacturer of UPS. Model Shows/Hides showing Model of UPS. Serial Shows/Hides showing serial number. Firm. rev. Shows/Hides showing firmware's revision. Runtime Shows/Hides showing the time of the runtime on battery without power. Battery Charge Shows/Hides showing the Battery Charge. Load UPS Shows/Hides showing the Load of UPS. Use custom background color This allows to use the custom background color of KDE panel's icon, when type of icon in KDE panel is picture. Color of background This selects the background color. Questions and Answers &reporting.bugs; &updating.documentation; The &knutclient; isn't working, but the upsc is. What shall I do ? See the setting number of port. From version 0.5 (NUT) the number of port is changed. Credits and License &knutclient; Program copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Daniel Prynych Daniel@prynych.cz Documentation copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Daniel Prynych Daniel@prynych.cz Translations done by: Daniel Prynych Daniel@prynych.cz Eng &underFDL; &underGPL; Installation How to obtain KNutClient &knutclient; is not part of the KDE project http://www.kde.org. &knutclient; can be found on ftp://ftp.buzuluk.cz/pub/alo/knutclient/ Requirements In order to successfully use &knutclient;, you need KDE 4.3.x You can find a list of changes at http://www.knut.prynych.cz. Compilation and installation In order to compile and install &knutclient; on your system, type the following in the base directory of. % cmake ../. -DCMAKE_INSTALL_PREFIX=/usr/ -DCMAKE_BUILD_TYPE=Release % make % make install Since KApp uses cmake you should have not trouble compiling it :-)). Should you run into problems please report them to the KDE mailing lists. &documentation.index; knc105/doc/en/psetting-en.png0000644000175000017500000017053711436653777014317 0ustar dandanPNG  IHDRE pHYs&cu$tEXtDescriptionWindow Class: knutclientVtEXtTitlePreferences ? KNutClientP IDATx}wT3gw~Uʥ RL4&"M(bnӨQ7b( Ĕ7hBQ& UzpsǜL9{R/zg9;gy;]mVlY (jԼ0uo óiBB! ѬQՉP؊V*$r1JM2+4t&”Rnz&Tu O!!s ͻ=Tt# @ AC dCbņm m Ϧ}s[館ӆ0摍{eP.ϴ7m2{P($M 8Nb=&6 O4rH/Ŀz]&zw "e蟩G.huPwH]65*D)9Gߨ#enUV.Py1D);)3Er/5q宐h-zj딠a*1jM bJN?6N$+1kP,46Y+쭾vp[ ,+TP\ڧ24S@KZP(JUWW%eL^ eS*oϟ(Ex47 b ~b{WTGk##/@_~ SJTD^dե~B=4x: *›C#LX'j(F>Bw)a6™{]B t&b&,K(IJeBRTDXĚV!LHUUe2,K)\J,XVʶ+*SɄJ2۴hȨ<|UeYT:L0MtfiGr&mr\V4˸ƥYUFe%m[?>۬Yq&(6`9EzQ조ȩ̍0C)N>iK2`XCGuM .\鎡_]P;eHpuo)+FGPmgLЇl~2r8N뜔g"j:p$#㊚=DU:Kc#B Ǒ")l#_y-~[vNwj˲7+Mvy LZ(J$[lr۶rssQx# .,+QSiݦmI]d{ ]Ud&?#9U2MxZfYVEž+W~ڪZq!99;wֽ{mRH&*Px@F2DaC%"H/!r0*4jީSI``ZialV(ewY 1 h%pT*BK #;,3p_4pu w>ۆ&\G_`[#_ (K`3VTC\t !F h\|ld޼uJ;= LS$mW)#ouA-F<̪!{^b_0ޣG6mS hLq$!Xw4Bu޶M[۶DY +Y>,iJ&p7[ ! nZnJJrhDv bیD5k]v{rtA .jru٫ mv_.^zM- ڦu;wXbłWwit*EL!%:hIS]̙%9ۺ\e ҨuE'VCA!p+ 8 =bJ6h/JxDMPm)#@)CYH o9ꞝb3B(Q!`3XЁ ~vs=OÝ;wjժ穧_k'-Z8,qHҧ[iiiiiiϞ_ iV\Ңys۶WH8\U]KJܬ9ꗜFo $ U+Ҳ&)jVܼ8=oym~X ϢlϒTCT,ˡt5WK:v87_nm"L(ӣG={ׁzkjj؂Rݎ;V)%s@ 63_BaĂm8еK]: fݺA|IsڥsΝ~6tܹs'5̱~ѩSΝ;yKuرs=`@]{+6AD= о:΀)$POB1)uֿ…(*BT{t ڐJϖwXL@)CQ3O<_pr QTP3PN⹵EW29g]RDP ̨s@1c`!^5>/6t#^Q#lܸ~7kC"L_f+W/Ƕm-vЁ Yn-*'?,bay7dBij?߫:jvի\|n8c͛Fl8fF<^Εz-%bYVeU%Kv=S.i1+VؾC6mTom +VL&O}iĤI5xw^ҥ`(FIXcx-]Re/mO~!X|s~`nԖ GΝ;_rq22۴q=2lܴD`1ypFZ}VuvufU1{?6nB=d!" .a[@ha1(!kPnq9XbaW=`.M-b%;@-yqu iK(HKkf0W Y Y*!&LI׶Dp#%@( Y/@Ŵ-%B߲(X9efeD׸wY+;B!W`عKW wݳgnmΫs&MPRZڟvmĈX'GT=PQ۶iM`~`B7ŋ{x[r6EQ4-H8|ҥKvڹKo'?[o_0N}ᅩeeBV-[yjz3! YXRK`>d`ʪ;w{4*F:o˿ڝ`+9FHkƽ4m!ӾgaUٯ27vQZZzȑ׎tѝt VRʬYQƍM#WSJ_9swQVVvȑ:jnN˲:utߟwޙ3gKJor8f͚;wFDE |իWSJw5}Ҽ4-yw^VVKO:dqSO2y0d@Ν` MY޶~Ν:2Μ3O޽ǟ8p O~zdI;!t6ltsٱc{nj3 vG~;`C`oQծ8tB1hBLVL*@/?cob%-**Pyg⥉D!].A -+)x/u ӻ/'O}5$h,P B! ;| / /}{|W5աPKBPuU5۶mm۶ [mm۶ Q%M,x>koQ2> `h0s,ܣ֭[2qɓ) / wuwiq82m۶ &8qit*_k 2%EHuuU4mVTd55J YYd*grt0.EXr̜5ӻg?{^yejlq̗ vO=$˯X ̗'=6O .b3gēg^_>ue^}UV5k/Ϙ4>}z/Zť]O̜5 ;.]SO/Z ̞v' (؜'S~XbŇ~(ՕkqoȮoظnf? R./({G2mڋoղ?I&͘嗯\sOo ;شi D0rvT*J&D"jkkv]m-b^}L#c!xx,ɔH$D\LuVL[GlØK$dR%5Sd"b/HR5D*J&T*J%IvKHqJ$)f m㻶m'Y]~bRlͶmlR˪;JlǡӁTlp!Gg19")A*h ϟ?k֬N;vl:Vʊf'I79~nYҬY[| .t۱Sm;S^x;wXETM Uiayԩ}}ك^1c²XuvxrUW|2e_x;sĈ+lvMu ̮}B:u2|DWy])@"/ vګ[__8P"DZSvJ^U$ CNmܹ0 ٣nj%opcvv[oe[70!;;f,kc&2177wСu虶_~ 7fGc^EֆaB޽{i8ީc?qOyY۷ɓ iY nB>'||+**ؤVso}5ٳqܜe^L#R%~I6|6du=.j!9(.JL91^XFzґzx~Ǜp F+i%;$E$\R-tB  Gy9DA TRS:%ܫ^ NTfJqRʂ%Cq&Oo&ȶ`JRq\!e;N֭og̙/; /Nm^ZZ#m B&",‹Ӧxw`o( JJJv޽@a\X {;ҲU+  #=&垟9:?Tܰvd|~F=;ihC2y7[HyG_HE,4dYnED!Tη@8$X-1׵{dT%bjBB0;.\7֯!ZE(!BYRbY!;z ~u{A(?)~fmC,[%0\yĹ`Y`x}>#;tp/`0M&"!.$gE"0fX}nႅ-ۯ W%۷4Qq豎C2&433aՅYb,&| .8pgΜyثXB2HV2>Ȁgk tdהBHmmMAaj$l;҉Z2YO&ZVXy!-[ڶu;T~0y旖Jk[NM<'%%%'M*QJY۷pb{X#Z޺e'|4t!W]}#FYfϟ|≇gkVG]TT_r[~\y{Srlfj޽[Rz$=x;oG]z^ƣeb^pQ24e&JJq௪dNwt+A51&1Ġ2J^편DuvQ|fch&hg^ /J&7y"'ÂaMMuaQhW_mV\lS  7:uEPa!gѕ^{k/dR5aaE~イ2Qq~qIX4iLA?0#ՆB3f̸[/9sfO}yJmf ] |mi(4Lp‰67>vުu˂‚$zQuu%e(3j4<ͻ_2b0ʺ]w/p+!l'b̿ŵsތ7g=xIk7t5kuֿ :lQhE.N ÿ^Mzn_kQPz '~X__?yd ,&vmeeeg~J&׭[wS(exlңU5}رcpNS-[P>" #EN,uuuuu5jkkkkj_|枨SLܟtϱcX<zb|Dd% V"`+?KsTJ2ejTSd"a;_u5k1YQw﫮d%\1c_}ೳ{qX bvԨQW_=a7t33vl4;k 40++wW_} 'lҥ޽Ԑ !CgΜ9~<`uu5+dOBzw޿/!>xGR[n=g0fz U|Oo/;M'cJً-ZhA5$X/~znNIGz^u5=!Y7$s(J%M%dxxټ2;^fpR,u's* Ab@܆}5:&Iw:HO1I?QE&BUVIg!J}aL<}yE%({> ?\Xbm}`= a{\Nvep%O1P"nT>?c] Ql7~~XkPc032胫!!{| YѬE .^hAlQ>Bnݺ;h4y<߳g_#\{M0ٮWGҿ;hlc7 pfz,CTL$VƸe?b&'E/4u|5.X&aW* ]YzaL̙Ø'Ӎ [5+++'7ql=B듉!ާ c;h47/(3F%@wi20!MP*lTៀQx OvfQNtE5gbQa?9("!957(oI@ riNO_'qpP |!ÞwBh$H$FP.'&Bw|b vp'1p1gX!sKQyױ+0hRced#n<" NW*ZcP01r R.nɑ 8v&$ $ا33:^(|˿Ꮎ%pDc; 6pBluG쾢2”mMʫ˺<B(W8A_mg[SC$!ݥy*gÙԸ;dv,.L bgƔhSc7׼uxʛ6z;f$?3 (6a}ku*v2庠…lp4 [P-IU]ŝfS/A[aΒҨr@{Jjr|fZJI |&;~3BE B0q?aKi|BƝ)ӯ󙘣A6` &JRq\W FlcV <$ #$4R4qh'(s;" $뢨"9Gbp!𡡧?Bʑ̬ 2KSEql1dBo' k87Ťga۸ӦU.Ԯh;9^i&Il-22$OPd38 x=[!d|-.AʋSڔ#9q&*#s* k(8'w(fQsh浒 ‰ 'kHQRRëuSf#0 }4mulBaӯbK$c *izk(SaqrM@Dbp%ϸ'q$8`L绗ƾ@#}l<"4r.:xt0U4ޒV h-2#*n$a6)``f+3] *+C(vT 70!`S`L! Dus0(ԫ 53F8.do+K e{&y H$D<㾞oDuܮ(Q6}p4WLyqBGMVb)ӊOG3@/?Sh Ϫ1 r$ Yz3*Jd?&sR МiW4/:ƀ3qX[Ś_s$}xfƻBAC-V雤G&(fr0e5'_*W@ !lz؆Vgc޳$Zp OBTԎliCAUhCh'}` 8Ge-3HG_8iL7V:DlH |vy |B(*$/ #[ӤV: C'N霊Ji(ӱ3#)I8h`3?9/o)4(޺`'A%ei:Tw7( AJ} [FoaEJo}? ScW!Kh<4ƙ<fn]/2 tm vVB;Soo"' ȜtbSt!V/(б ϋ) bъkIDamoD8ڐԄ61d1r)Vl~{xp謐gnA0&H 2&pV[rE !~vJL $G8+[,@21 J!VdcOg˗-͟īþZ[pg)<<U77.U s)bz2E@pyw-ω k@J<*7 |6 Zo)C 2S@pt|y6lлwowT? Е&^_`G\yq*FM4%)jL~UEO9腘!U^,iW!H3M)S^ V(E7*M,_Y-!"Ej<.vA AI&ե+Y)) $l$gМkId)SS )V$AW* O@w cZ"c1nQ] uٓ f220@<<*|!c1,z ;َbzrGcqMFƀxEɈҢϦҵ9UAe`2W5PX_yw&8!OtI`PP ק|(젪kEJ X#;^ qFv%U ''ļP<CaIY %$1n0f~_5ê0#VS~V___SSǫ8ꜗ͛kV>ղPBsE8lx 8M15!*Ie%e"*x+q1׼R~Ql u߈`~*<}p!Z]4J,JG^G"0J9|P1&jGBmeX#htMIoȴ=CIՃ1}HDIDnb̘Cmaa0SH³ɄpQ,|+X`ʕ+,YkУp:@aӐk7{+"Rxh:Dk( ~:(F`ctC&Zc)@ūԎWҾC݊.@<\0W3U2kԴa9kK=geҦ/sȿUU3M{ د&a+83qq^zUA15!G CP*D"Ke K’@/ bi^L@ ,W=;vt3#0PVN6㵱;82WJGsuvv r]4L8Cyh{~Cr$Qh;E^_8zy8s#? TBwJ-論f+ݔFҸF8Ìض{8 ۶7nسGiMϮ7|&kLLf~u qqضPJ[[oIU۫WP={85u<ҥKF|~k_ѼC-ca2%}]~iYfC 뮻Xp>C`3qX(ڳg~Ȃ [n[o NY+TFhF",&T-Yӆޜ: JCyU搆3TẉJd")1b7mY@eeJ(Kt)!8z(` (orڃsq۶CcۉDXV*D"m>i6mEn^;61" IDATjlg޲eK:ȏq^)^o|ZTVה6;J'ily"<@ _},LӧcG}eoBMKH??)n^`Ȱe˖QzDQ*(4/iAʰ44!5Ҋ2K_0} ѡK*BoӔx@Ydˈ^J+L2|T4 1D"H#D2 ۬Y3϶Z[NV^Nդِ!Cڴi.7  eo[^i[$EyU5yG_ &G Hꫯ>}$ _{̲!Cqyyy gueu~ݷo_VkΜ9oƎ;Fq( :E @="ݻ?83{okҲ+FqNe "';ԞT3xs})TwX,&xpҴ(;d48rV#) 05 )BZJ t;KҼ՛o(w5YO')Y/te\(Bd`MFH$8$mSJ . (rDĹsI/5h׮],_o1thANݱWavW{~~?Fm\4Ҹ {Dٷwo`[nߙ4Q,?ǟxr>kWf=%Ç?3sNsQQ!\v٥wy{Ϟ=Wf={gÇ3sf e_}eW,[/\2| |Xۗ^v…9hC5#uEQM}Jk]?EYq)?|n i\+MElU;GT2h(C<[R8p}e[15z?;SȲ,˲eggFѼ\K.@5krx b_򛆚d$C!'LrB SNwdAn٤cϝuY+Vs$̗t"Lze 2Tܺۺu떕uEbo!m[Yp㳣ѣFo',--=p{?ӻ2=c8_?>;;{1FC/Eছn/]3i* #=bѡ=I ]*Rd+_$<֔7{HDrm[RSYs؅7F(//O{ŽpnQfwwru*؛iWVxL>~!Xt(**_|ųSf횺:VRyҢE À] ~*vء-t`C _/O֭[&O|fi۷7_`pg[4oC!@Kc.OYHq\WMtk04Ȑ*ۨm& ~w|W ūi <21ZT7Y訩^z΃H|c]]](J&)H$ -_> gu8P(tڒY9yۧcS N=gȒ-6Ǜ3)j,]~=w߽w)Su@۶?#~Zmۺu"p}z袋;ܚvI)--%;*5CwYQQQVVVo{wV Aw=u@&~ ґ[7Jth'P'6m1icSig@=ln9j,lQ}}}<5555)ێb555wﮭm׮]<o߾}NvFkjjl>'|XV8)r=-b oAJެf_ݿ>Y/f |n~AA<):yg? 71**36jkjϛ7a l[mJ^?TB.BxuΜx<>O)'dPcSJ];mNWO?9ƽ+ )[QJ%\P@ k5(9:QRU=(yFEEEeeem۶m׮݉'xI'y?O;>}kN>dBH"ٳgvv8loM%+ Z9$. V9ّcoܟ|߼Wκ|PMzq2_SJGfÆ fe^^>zL{f{Rf͚]tEwq'5jԨhv78ahW^cƌe //` OaBž}}/494NyzD1I XC1Ae2ѹ\QÓ-гmA4*u$ ,,Ґeaqܹ3h4JeN*6Xaڵ:ujߡ#=d ξaHx۪%[s'[]Wq~_-sG6oڴqch6l~% "A@TɈkl}Cg [DJzJ$2I:j'fS6m@ۯNCe#D^Ѣp4}7ۙJ*P8Q5|.y GS3S&DJQJ%S݉KV@yyUWݵsW-oQP5A3Yȿ:O3cp3ܠS5*6QENipY/eVpKW\ްБ" VuH 8ݻ[n>t:HN.aV9xO5o9E Vs49=zi /"E-=}D9х;2J56iKMנը鳀]DE=ePဎ٩>;H]- AIB;iYE <HNA.qVH>r(Uw[oߵgJ$[8j_fX.?Z( aqRΓ3 SHm~mi9茻Tgl3*pșQ;K욚d*͊(;ۭ4;N4W\[OsA6CgO-8'tX V}}}qqsBh"+oSw>_|?z?AͱU< 2XFK1Z (:LpWC6 (aw-? ( Iԙ}׀ (6Y@P@ , (}yYicE@P@ǀڵ몱c:vh߲E]::4Z:VP@cg'} /nٺwؾKwP@t1@^~Wf[ҩ?߯o6[:)S&ϟv+Hq'P@tYfE0dٷ|Ӝ9w)n=ܳt+**x;nwy_{z;?1cơ_Gy&Vo 21''g[E~@P@MطJuWbE~ܹs7m#5 vlg+nr(mn"ba-Q&Jmd7P@Ԥ(B!r|~80q啧vjuu5+oӶ7zu##fZڶm۾}7o{#אRT;'{ƌݻF7[wuO>ѷO%]wݽgϞ^v,snպu*O P@5 $ 6JRUU'tcuurs;|ڢ ( C͛plAT2[ZZ(P@{FmWVVq 4x<^ZRZYYiVGMJN@tRgM(X,LRz{Ȧ͛7?[Bdzp%=8oڴڵo?z3?2]|Žz?LJP@F5-o_ޡ\rʕ_ݻX]wy '[h-7_}}mֿH$'N>5kVG4Rv۶yAݻwU[>ңGٯ9 O$<`-lݺ妛nׯ_^o_QQʓ}קOt4g!W<{֯㈽?)ɓ0vlV!Zcǎ9yXbSh'O;zT"e{$$V+I+W*hΙC./**Byx`+W(,(`=~Y ;;CeYj?F\f͚q͚+^8ˮ&^5 `+'77ߖ@=ܫ1ת":LyT,l}-m1_ӧS"Gv1 :5+%51%5Ud<ʸ*c^Xǎxᰰ {{];wݻ\^^^uҥ˗/_rBbej:==[OKKE_:x`BB©Sl7꼼緭 [$pm-էOmy[7p!…) q-l f!>,55 :.ޞp\XPuZqVXq)r+W7ٶmm۞?\ʨ#g}ݻ4M߼qSW z` ,?0f n4BH$LOOt,[A-.(_`aM!^>ܹsPPPcעQqVGǎ%bsȗ)8z&Ojۦml1j7aDGU+Wultk7.]R9OǰYf͛7K.}ٳ:vm֭B-tDD2:ڸΝ;Oxg;j/uttttt[3e.}-ZܩSرaa'OV(<qG1lQw͛!-Z4PF?T(kAxR IIwiٲ<4M'''GEu7¦[nEtf0hMwSϜ<ׯ!>/N:ղeK!tPp?!!!um>pٽg^s>, %aPumg?P? Wy Ͽ};N IDATƮ8Bm۶5E,:7WoAHk*R*3@+-x5$$[ڵv&Ä*Fy #*"Sk֬X,|T$z@oohBpE) _jժU`Po޼P(*70h!CK>i0K,3ڞoxY__JL?X,'I2)) 3=<}}}z!Yܮ SxYlşvt+:3nm M,$P(Zv@,d2X\!O3>kCӰ%0N)/g !AD,W 91!-N>^[-kՋ2rT5p*&ϸ ͉0+nečf9 * E!Hilva!_ <} gaZSBMg,eQ(8RiC?ZOBQgյh1V2ʃ4dO)9 B=7Ux%ն0i,3+A!(oȲ,05w%(a!d bAI.`ƀicguW4MF_M1rsE"άB!s*Ht;88 P`(l9\a"Ri6؊oz1LjaƮ~crrcgΝU~ZjjjHHapdk۞tmVpzCT~d`FZYǑ8%5e֭#F 6[,FZKvڵop9ʔvq)$,,l +;{ᢅ`4o~kc{SXnk>~'ԶB5*5j!\O١CjGY_ުU+^f-|Z6A@+,(9=>++S,M\pA`me L65cG?=.^*3۾Fqڹ@!*Rqqh9;T*ܭ5^]&qٺ"F3tsy*o͛7/_0aZ;wrZDW^R9v7..kDװ~+??sڷaVXѳWN;M6lL6mڷѫgaAnXz^lt֧"u6k,FlL;w@Vvvsr11~Bn>xDnU y7)er~~.o`Z,v ÏgϏ‚}Op۶m|򴴊Td2O#ĸѣG=rAAA/\ۊGolۺ#Bh/]mք 1[mO9Ӿ}{JUe윽{}Ͻ{V={>s>|N>ճWڝ,{ 95![rnt5+GQ[䜜۷o?EtUթ2bvdeٙvlJETt`ǃq\Z׆v=rıĄjO8vAD38"2-IV,'0 i7frU24޳g‚oׯ6r6n_?/^ .,[իܛ$;;9`YjV5 h׾xJoϭsݒ]v`^tE6/_?o35DWDR{9Ν+?`Dy2IAA۶m$3fY`^\_=šaDA\yyyqSSS#D<ʉ'v P(>bĊ+޴iQQQ2423ǟ4lcb-ZڱP(.ZJh*gܮ];ڶCBBo" .΄ֹl (<<<<O|}3[0!C[+7qıcc;t՗nVZUuX0L۷o hf( D"Azݕ+es-V8bĈY>9s_%K*װCrʷzAhႹs cr={XfoݻI0BȎ6k<VGǎ%bsȗ)t6fܤ6mڎܹاj RA[!ip~ׯիז/,XGĭ[Ο?8X,~8C!7ׄI+/߷.cбcG@aF`-$P(Z63"L&Zg#BϠ#؞޽z0kD3 iAD,\9AB^~bY}6K|roow ӏUL k !*hKqÆ_ziҥ\btt }-ܹs!7oTTPPP*>G{<[n"Gbh!P_x.]RRRRRRt>|x;2dΝ999fܿ@>}!fϞRvмy3fN2e2ٜs,J5jB67g`Z|j^vU]O#ysU !rxbYaE(G)gOx}l\4MM&//oB8gQQanNH$|gG!ʞe}>h).ֵjݚaqfDqu\=S#Pg5NKe/wVĖ!/2t:F0A_h -H^^yyJO:V!AY櫨cn:^VZh)**RTfV S@,;or% .Mqq gneYhXX+0[,F?g:th-ݺEIIIKP|D!3~y({_B̸BMGzU*':reЕl3flݺ޵C!UxLdc³XPvtdcydcƮ[0 z;v},T :w7nܨ럍|}!iiw-Z|iugT*Xhze7ǏGW>bZcK.W{MiƬ,O]z*\Νܷ@=%DL/!Lz>$!hBRtkZgt%%?cVob-[d XÏ>{;v}zw}׾I&͘ҥKڵk,Y`˵III[lH$_~%QUy*0.tAyH}t|K/mٲET-X0۶m9}}vz*l034Y.& +(u8z %qϢGn%KΝ;f@Jwy2O1CRT3fݻBQ;wU(zdS&O9q߸=<<ŗg(5ft2˲ii~keV~~~Ӊ]paي׮^5 `}nnb#Vw ۛ[i,]v_tgNW7BGx䘓G;v~~BЙBMH}NH2b >Xf$50[O)Jk4 Ƥo^Gq V#=kݴ4M߼ysZ4[ŋ/^hP̠ %L&P( fϙmK:t󳲲t:%DGW;ǝ;w;oO+b55PSSFG;KJULY#eR4*>iU, j}j?W$*kka^Nj0|a+Wؼ׿9Ao-Cxx^*>{%K޻&vLqo=aٲχ {e_7ث(6vQ#z=7 G'cbϟץsgOB -?_N^5Lhs7MIII"# m8s\>/N<٢EzJ\a#l붭iw*D5.@ ?\ٹ\qlg{>`@QQѼ 9Cȧ=SCsQ$ENNn<ONN")Y7m6vEB >A5qdh&+A-d5R Fb4FD S322J -Kj;|*9Owvmr\R,ARjbJJB_ ()]M zLZf:'IrZjrP0&A@X@K@QdNf6`͠,U sCDU(| f-0v%EQ B_[ tV7n* gÞ8;"xWx>% $hKVb)S!D͛7VHJJJ+!B%m'rFY >sQ9bϏ$n;qf???___X#P^(O<$"J$RV/X0)Rκ 9rݓ|>?%%uR4333000""޽+J5kRSSW#B=g6IRbh-|J21a>i<YfBWT \n{k߭[ҸUu%oM:>[z&435?Srdc!(X\g|_@Qb* EbOY/>*Jz-};gee !C( @帰bUl)#S{DU!`|Z.tݫDB)ydwW΅ Ds BDmyɮgewEIN="Bn}XZD!Ԥ|=xǫFbMT^p4C!C[ BU|Wwn_`B!"d`̄b5851" -6//O;B-E>L"$bvB/N@Af(sH0B~\(Ha sA͸2jkb"3 ."^_.K$ȃfo+)$qxBVøXT3Ch:4&'{3LK@f'ڡC)!BR.cG:ޱ}Gi^dI޽{DEmڴKLKK|'O\w.W˵II[lc߾,.qI~Ç ZdIm ._e/.^@5vҥͲU_}/UmΜ9qӦcǏou8Q&ASZZR/Ko߹y/)99=|iY v bV%v 2Ak 433mٱ+ R񄸸6mZgLWT*j{EBaNnN~~Y*3fjӦs;vڵP(d'O9qMTP ^XZ=c?kj4X<&6ڵ5PS^ADBP@*J.恈:ȟEdZ"gX?1+"&&$R7~ 7k p葓'%&\8=V{ıJ%Qμ>$IJe0 c[???J^^Y˖nW_~)ݧBy2m.^|ŊkW p* u+mT(܊H$iEG{RT,+JL%Hޓ'Ȥ`}CC"6h,l}-m1_ӧS"Gv1 :~aDJMM}LMMe-{Ri/V}qB IDAT̬w+==BԩS_5.\x g֧@PTbӕJGwŷ]"k"DY(]{=~b5z=y~/]mN|5gP^j+"6m1 ™`Р Ͽ{.Mw]`!m[,^RP_Px☘A\III4M,K3Ut:tYYY:nɒ\dB ==}Μ9kUq+@;wTlt-Z=p: )v>] bc%J2V M<`,<3)ZTPPMÑJ=:vM-P(1e$a 7q5V az~޻殮.roe6esf^dァhƌs>TW`ll싣F CB&O<3L4AB0b W0a[f"[k/g\[AZi+maXb24c61ʘP6t~eBIIi٢4M߾}g^a3S Ed)n1zbmJzш>~o\|!^~R-h0z8=chhŋ~!԰BD,>vhpp0WVֹ|'b"k |kb5:OJN[:T܋?r5dx,Ue%!z\=waYie WJR}[Hl^&:\q;nJ=_R↑[}(gx'kU~\XmB^tRV apvmrfƺj1DIt*`aN.467] `Hyc5@B5ҦɾI-@gdXՑv~-"ɍSY°@d<Xj-փo+gB k{Y9Á>*)2MS$ؒxW:psJh97re]|el7%q|>EQ5!5rIPjbTW|۽_p6B;?aʙ;vYI4MLfoF @U,,* u!=n4q-ؗ1D59+}q>D[znya2 [;ծatm2 ח:,J=Z~5Q.S Pyf6K)1ٙ*|s`ϥZ\tt:LJa^_cfB%/6/'ۓk!(9uٶ㾸0LQQZ2MNl2yEEE hS8s_~w4E5ּ~5v=k4 ke?lҴԻ,b1MU q)ǎsyٲ˗-ow++S,MlOe۷mg݆ r:4 5jh_EcL'-U'ǛOiW+h2Ι+.j4C>WoS[?zhpI&Oսs׮&h uց1;uudYcx2i^s< X/h6gϝ#*GԜsX,?$"[6l`0_|ѧ_"gL/-a<B q>I7\XX6';_Fr;r%T*6mZ;s|_d۴c 'Mmp ƌqՕ߿YViS9_`|?ߪJ?7?ҧOz9.];\%Ww3|0g59ug<׵AܽcG׮$t׭}&:fϯ;%bqhX1vjh""fDFFڧO6Ri^#q9<h4D"(,%Z]^^^遁UU-td:PTTT*tZmKȰ~&FL%B: R8VX?EOiQ@玝;w0LP(gϙ;B|≍7>2Oue2dᢅYYY:n%\3=T|g-^_P_Phh.}`%K,ZĖMKK7gLwUB ߏRg>@gNZZ;S.E*O#_HZŖ駳,]ovj}O>x0g1cvZe|k[AG<ǷƓP Iq^C2;nb>qDف_xΝ;;6,,7ߌ6sKǿ5{İGmQs}֭V81qՔ-Z8C۷{]+ mJJNe0h咽9y4"_[P|>_(sD!t BTrȑ].xw^V+0l&(lݪI&''7-C@KPITSj!cZB1b!CX5 fb1A$AŰ›em`C  qƿ8X,~8C!7CA$I`dm|}Hd2҄%IR.Zm4g2L,5/B }JKKsssmrWp\gH,HtjC,7=AX,ؠPBq7EQB,˚fB˲E d2LµH|WItۋ~&\@*B9UW3ghdeY@AA!!!B޽{aקo_V۷SRR!z3 &l6$IJ-ZՋ`WX[l%=zի2T"b V!+drO"ѡm (T(V+7H\<~E*o{~i]i6XKEEEYYBgG!{7RݲMdrIϞ2LZ/]Ax<["4o? Ri 0e'R^_ח ~J-[t%! $I///ojcZFƯIT*'/ h^9XCMӹyyy Thٯ7x0LQQZ2MlŷPWM&/WQQq#6s_!dТDw@Dzf,іeYd0V}jZăeYhXX+)))˖.MK-Xdaaa;vO9~+-[v!!r$]-݊X, Ԇ T<%P@gj)c.j,Z4ꗨ5A ={vc۷oomkݡCBN^>! 7W [ ,"d2hE2.1 0 M4M7x ƹsf늋СaNǭ=v48(Ķ)==)DEEu11..K ۺm렘.]5taaa,ˆs+?o~zw[e? ìbU~u6}ƌR}BÎ ɞx E6z:Yr{Hl6s cl6L&l6i~8թs|JjeٵWeU~<ϏuFa+˲Z/2O>ҥΞw ۷ܹs3ps;(˯JJJڼy{dfeUޱ ?msXo]x5?uoPr* .MnUŽ6n>!-^=:eɶGIz `0LFPl6*9Y?}vfqc/W.J qqmڴ~pꬪ}#G+<=lmޥKP(&M?'mfΜhbc^ϜQ]{~=~tV1uT J[ߵkgZV*L2̆z<Ӹ\HS*mڴl6,QFݸs~f͚)ʂѨqBP(egg5oޜ{Lq葓'%&\8=V{ıJ%Qej4W,_A0i$K/Xk|APp+"Vw m999Ç_0նφz5jԨlTj|~FFL&k֬YSDee{sJNW~gcS"ucw۬a6[d}z||{=*J*=z8.FHU橮L//zaFF㸶Ǔ[7BE,o~1*DyFYrҥK'O<|𴴴[n >wS(ܔeƵϔj'iZJwH,zMG؁;vl߱0LP(ddϝ;BxM7yU2xѢ,NtR.ΝZÆ lܴ4Mߺysƌ5!pxf{:00𩧞իw`gn._U)͚5U(~~~z>777%%6mdƮ{-eM4J=:v\.T#FLdAuɧ~|㍎{966k.*sAF2xꫯK)bǎ6##?~};#uİGmѳSߺu+((u|'Kii#GgZg<{niIXHTBu.zHH$:(j) )))A)Ft$< m/@.F>Ľ^!PO\DX, h7Dٺuk\ Զ`FDR)e.UJJ$\ "ꅇW=չs !j-Oi$ ,K4V1 %IqqBxꩧ$IcT^(R m6AFW]QEBM;3@r!l App7)~~$A\~:!S=rsx<^}}} f BZ*$I\.j5HbX&D&(B5(wgA&6O+pE"Q)!;Ƴ*BQP1!l }B2 /]2&3oSճBIšBoD&!Pݾ!m~j]bExXG_mX˗[Vnڶh5=?~z&nĉm,w|gpsQj!h ܪ:_\9ogqqϘ1y>xwl^z>,>? άzq7M"0uziM..e "h„i]f̘)J}YHIS]%%%< ?m1 SRR'R^_ח ~JeO<+)a!>篢7<¥dffx{{{wn&o3g~FrxX.;ٳDt:__a z=m/jjZNGFc?эYerssm?V[oVҟ'ܹs{z4ֳ)*.VfUT\pMǸB o+7#GkךLkѯָ31&&&k׮GPޞs+,˚FZYǭ디eKeha)|)ǏzeU)gn9cE|ɓl߾-y1c ՙ:uBܩ>+Gϙ=+$8蹡Ct4p뎽J*ٽjco="У.x<ǟ|R.ߞ0 >3O?+jTd;gH \t }bcGmU3͋/x6>>^ bl޼K$ѣGۊbfڵv{OMGۃܸXcO 8S+ˮ]*#B.Y~~v{.j7n`Y+u/-5krs~_wyos IDAT5\ڵk _~9s-^K駟/Pʕv۠$\p9P[?{,lNV?~i˕RxB\\6e$?ȑ# gPPmӾ?M:UTT}ɥoߴiZF*L<\B~ܢp;zc 'NyO՞t„ rGL̠aÇwɖ?66cXo=}Яo~Mr5b# U:í6Okj59W$ qw۷l2Uؔճ`-[z3'FD񵻛Bı!!!8+1BD2СCAAu]*R| ^IQhٖTbyɷHzuD!-!H.TJDj iU+6hNeFF-P m=+V[W]jr9HM4 c!]b?? _~YǙ=<<|}||}}béB9g5dǿ@%Ir\ *8X,d"mF!{ųuqӠ"Im91!=g?~kX,$IJҌ ???^tڵVZut +W6` !yZM90h"55R Ο?\XXHDFFFQQ7-S^^ޅ JJJ.\pXl0!I>ӧO>l4[h!J1 h_ޫW OOOl cxLŽp7o^e6\m ~huqfZEuzO^k#n{ihN[r9ťŠ;ϻg˶L[ƏG!s,Ð.mZkn$-IH}"SX(KIFi0cG !+3glC}/q\'[tEadx3m3YD_Rh)mo/R.\a-7'<\8y%:DyoP}NeMI\%>OQ#D= //>.]Ð'v'O.8K0e2EJRLOO =|ּVzu`̘e1:4WqMfET˲}5q. Hd%a`(mEmZmk]κG:~n (nCֽ?b$\{ߗ{E73##)񵝝B |V޼١GWRBBϞmjt˳ϝ;s̸7::֟>=٤Wz߼hFhڜܺ;*ywS~NN*4 !*5~NvʕB$99"ᤦ֩SǥPDD\.jwuux5jԨNy;?x&TvJjy%rNB[rkGG BY9k<>;tsRzV"͖JyyyYYYvvv111iii999ɵkNOOgx"!!f3?& uҥvUvJ鬬,JE>R*%YYYZ hٲ7B&Xى)Sڌ!55577Yw|&HjԨmذFafƏ&{|:WjBӿ>UKV+ M5?||oFC}ֿiѲ坒G!bȑ4!xV~}ݢuLJJb. ծ]v >bDZZڻ-C.=+))Q L4D9s6mt"Ãw]x !TXcDhP|>_?nb15k]r9߫'L.z埋Ba=[܆4A",222v )XTD")^΃d!d1R+b9!< ݺK':"4kѵ{kf]rtt3vL@@uǎR 3mԏ?>//}mBU ky/|@Q<NzJ#~zL/_j={8wrJ%$/[MDw T"3 2dwj7p`6֭&G0`M[#"͛5_b>tPE7.%%kȑ`k͚5K" 23m BU833&nr^rtr[aWZ EAXÇ >Hp{;W  2!*]g999̌.Uil6ŋ5kԨnz֨Yk(~xͮgBȂp'Z[EQxNd!@ HHHr^V]72t:tT%cB53~EVbt-V9BVɺ٘1 "ѻ+!MxBpt BB![`gVVMgrl6oD!ۉgWHIM슔FQnnnNN@(I8 "PyTPP4koo8 ϯT:VjJ^\~DxHP!gN*77W5ZFШ5'Ei[vvveW!BeƳ?pA]E7ɤ6\vMt-Lz>ӧM3Ciz͛5uw5kdu4M3T*ij֨wN3hi:++ER L*Rꚕ-lB*-_xnٺf_p^׃#**j).͛7Ϟs/,z=ky{I%n2)Ӌ HR_+c_dqvVL*ݻOi-[۷>kC;tح{._ޱsgΝu~ /GnҹK6=}O߾!O߾Ϟ>-u *'ݼq=Z2vq#L71F _^Ń^*fb_&:@rrd1O4҄l[M,w|ywo #V<Ǎ?~zzcƏnݺRcǏ3gx<^PPpݺD"ݳIo޺%ԭ[#Q:H4fsBÇLj@,+e˖6p ؼiRC|hAA,"!IIJܿwOrb" OZVtSEӧNsttҽnwGO ŨW/_XYr3gʤRP8y /@}9d8rH>*!9rim9{2YfZ?ؼyۜ9SNe}̔m~`Vx4vF?0eT& . {lqf%}떱E9Xjժk?jK~9)wBM%v@_>oDxv")ݺu Qd۷uegr .\palvvv֭_n=DejĻAҮ}Эtq#BI]лlf+#tTVDm?Fok]]-xӦMMLL[лOʮ񙓋2֜>y/|@Q+jJ|8Vٳyb>rѣGfB>׺G}#!>}Is 08 6ݡj 4buOpC{ܸ)))^^#Gd?lJ@+B]xvPFfso/~ZUNd蘘|`"FyU332"^|ٶ]{B\?>6Vؕm=_$_xۻl{Y.F~ZYϟ׬YSV=k5?r^<fgB8gV(P^h iqv99ýj ZkT&uD!ۀ*lX,O:ݨaCZަ?|L*ş !xf-;Ţ?~|v I rs BY9gւbb;;;ggE~>?وB'gV(@M~HB0YU!Tx7B![ !-xBX[Y1cF[@B֭0 *-g$!YwjzCrl6B:Vϊ8w9D9هX)vm6m퇏pe~*@sQJU,4Jvsswtr!eߌׯ8>B10..ntiO\ Y񌡭jhڜ\_Z&//tf{qEoDPՈg 54z)\ x9#L)s'%V@,%;;ݳVQ(%f֨5P:ѱBVjM \JL/rϬͦii:++EV L*R꒕ʮ>BUjשc`A%ʬ;tBJJ&4&kZTCeVԮ]ǿx *UC!Q5@ ]4RBQ0qL&Ξuıc."nߺu֭'Ohr>V !dͪFV[ Uzg3e~%2eRi}1~˗/VV:ԫw>> N7ZtpW0yάRD  MTTTnwGO ŨW/ _3gΔIBpI.^0!TvU~W/_6mᅡKp ._Ys4vF?0eT& . {lqRӴ۷nB,Y8ꉻժUcf|ƌL~.N^bJrAB4cU#%&& ̭EhEQG҄on҄k8"<;;+t.{P hҬE=.`Fte%Vl6;Oˣ?S9]\]J%yBH5Z-)wߪqƖ֪eW)M `*Y\\G(ɴc| F!o-JM49uTݺu["?99Ǖ+DW+͛gG8<BM}+D8u?? 6'[ ,bNːa#Vy0׉M4SU4˗/tP(ccn]i&óHi\._RZpTbPrBXe9k [Z,b.]BXϟ?YC) cLJXL8 e⫄]+B&R#3}U)袗~3`X4G36-2wzHD"?/CB*!@5+þ]3*@QYѐ)q d2LKe5BY1B!jgE탳;r.N׫E2rWSl&rq;;9.;|!nXBd<+rșYT$6EݽNQ|G(. !TB|+<Ƞ(bMh/R@u܍ !d!4)d}_ջ˂En6ed߿tH]!_׷o\\Ef| ?>6.~ob^rr cb͛gs:tث蘔4˶*h%h4x.6ԀШ8=m0:hd\.7u"4k$..."T*MLLmTF-DGߺ}ۻVԩٳe˖;#"e2SɦjdRg'8,2atLL>(YFj=Wwrr6Sp8 +|\bZZ2/u/% ~Y5j,^H||D"bJcMJJb®/_<ul\<>@NNN^&_Ш5|j==Tv*P,++}.]RV«V ͛6)M!!0dȷ̢qcRRRr… tEueCP;wƍL_ $jZJrٲ逸6VReJV(MYYWWZE3T*DmPx&6ڸ1xĈgΞsq)88kɓ:tЫf::gNSEF^~C|||&۷k[n=dǏ/X07oTgh9s&e/ݫW-o[P|_f {7kt4M+*׮YKR Y~f^A.` \:oƎ7vܸRm}^z"> ϐgJJJ'MȊ!T7ޕM 6dȐ 8vjlY^;uZhQ^K&(8GϞݻw}LbC.[aQT?Zյ[ݺZZ6;w޽{޽^{ϞO{ջ۷ hᄑ={ԩӊ+BgϞӹK?C.0 ǟT*-[֩S^zݷWW6y?mM`ϴ?rh 6鳂ǣժ+Vnn 蘨~C*SKggeʤ޽3xf,_6rsgτGD0{쉊z#4c<oW˗;Cwy`rrJirU_f~e[jJߟmۛg3ҏ=:(]~1}lp[ݻgoJOo۶I5kO?~5k *6}3bmۯ99ܳgsFDF zVs޽-7>u}vVbm5Cq]w߹{+_bLdoH0x&djb?{x`4CU٥n2Y9LǧM&JBqtNbL.q٩S899:;9M:sE#Gݺu1l83rL8uꔳ0[y<1co޼e^5?ԶmԹ&O4i$-2%˜g̐H$|>~ٳS ˙6e V ȠߐJ@D?D߷8ǧg%[Ȋbhf>S\/_sP{{)S&o BMaf n\z?3V0VPHÇ![6?zB"cؿ@O?iKIOO K.CFӭ0iy<]u[1+_bLdoHcƮ^Lda^E{{?nC s"dU⸸^Ź`ժO?>}UV3..?W._vP.. ElvRgff n''׉|BBStNLtv.lb…>ѣW\9s[!7^pA•SRқmX+1oR3" VnT?[!@H2LVnt ߵ{7W0!+tuڵqZ6.>~ݺuݻug-ZW1w?oժZ -*^槟~nݺ윜 ^֩S}ʔk~e6CL̛_wi ry\nΝ;A yІ]0JΎٽ~jj JBBB?{&s332232 _3 c=cLΝo0`KFK1auRLKkN<|>K(5 Ƴ3zzO8Cǎ'Nlgȑ̢Ν۩s͛6g|3qƓLةӢŋ۷kWG:l_|V8ʜ9/_ҵkױƵlBV#GwN.N 8hwG}3dHU5I ԹˤI56 kƍOڹs'=Z o5jdl@c03ƌ=Z$r!~Ӭy3y VnT?[)8Dsqv2lX,f58qŋ1s?Fի( ZKvuw"p\9oooU.fCŬ*GZ6f?aߨYF/v(~?y) #FVU*}W_ʶmGDDQP x}{Pwfyx~ yPx/~Yř'OUtWXϋAVB绻S,VxxxXXRM&S=J !bD"uvr2XAϷxYgE >_Cn)H 3[0V* G!d 0!Bg!l3BoDAj%wp\6m[j1! h4VYse/qOixjy E-4BWA H{wr !SӻFW(*.=Qkgؘjժ(zmAΟիW-wQr*Y'%pNjJ"dee4]1Ua׷l-J ڣG @HH+|-4M+*K! RO4U,g'+V.7Y;wx׷7 hY-+Ξ7֭\缹stJU]uڭ۪UU*Ueh~o֜UB۶5xnᄑ={ԩӊ+M$$Ϟ=s.:N~\k4={v)***o~'(e˖uԩW^{mHMQdՏ=Æ )VXQ}"8@N8UdoPx|Vq> 3x/lKMI=tٲm۶M0 ;BC)իm]jzݻgo|m۶?f͚=m%K_C-Zn 44Tk^[9gm۶sAXr~Nʗ ݻwo"_jկ~e6!8xl2+TxI-Z􎪂RdDgϝ ٸO:i"r&OT9!!x!!7^pA•SRқK[a6T2󙙙%MC^.1?*,?z[E.U! `sMw57p.ti suwܹȊ%f(  A]taJdz{:a_t?u͙\?ӝrJ%!!!&Oj;w8glfp:u~߷﫯ZVtܙi!3J}|UUYPx3gvHHHttL*:l>~^vࠁСcF.b+*}3d"OѱcQF1A'J\]3#ظ)d谡 al8i$Z6lѣW^ݯP0Aa7JU9sf\㎝;%7_xt+}P(ꫯ]/H_RSRM]{BhԀШ8=11?+bբg̜y?*"(Fի+ *˵/?]Qd9g4bpZ]!B!Y- snJTo;L&6,6g^5jjgbq9gϞ7>`8 CQT#B-ܿ TpFBB![ !-xB`E*T<fc>CTa>f!PTa@&+@%-:)`^BQ*p(vZXjaezGEP ,M ˴0[ATδ?x7buv^\؟P8[/ ^6egۣt^Pߋ/ )$*V2[HlyU<3VlKiF/ YRc ;0ooAﻤ~nl攢oD/oEV+@ i|mۦ ThoMuYE6BY^?C!d 0!Bg!l3B?#hZZmX.f͹aV{RIdLU|'sQxh4ZgNNe+jb9pX=1br4ʲVS(5oj2`DbQC_ݵ l<bNO"c޼4U=&TZW{RΝFYYNNNMZZFPyRV(rA]l,ү&kVXFbcUf0Oz233ߞSU~=c[IdL{LQU֕vʹ(uM| FFߤ;qKSS=}{S I)N_"*gLO?zorV24E…N͛u QzO4Ze;efgQ] a/autuO8<'A5g_:ECZ< jm(zJ)c%ԭSĔU7㫛2flV!bE&zn:> )'?(qs?qSȦO`n?['1yb['3bqNN/駍6駗.^=}ڽ[[ St!ݳSE]:wҹSe;$sx}5HҬiիw"~"sc?^7cz܁K^={5jذSN*’WF9/fib9-ΏGOK:{ޠO4Di ؏ #`XяnuzȐowv4kVN fP(7Ӄ}շqSF;z}͝;ZhvνgLߴys&Mtw̞=7nl7F9[VݫM#|] wk֬'Q]g=_߿r 5S<><Sڽ݅$:;x9sW^a։7mԯmAzRS@feֲʄv,ͳqGo4qrv)zaVy͚Z:ujnNN /n/pRYI߱Oem>?}z`h 4sfX%H f)6zuB׫Wn] $6&f1M4mhȑiiiʛ/խK|g=z4jذC@%}+eO"cc֟^]JbR:w $%&lFkl_l1c}QӦefڴisc?1Ӷs|4<]/~|j߾'MH Ċ|>ܯ_9|X=op`tѺukyHR}Ժ3U1rg"y|Zϋp^̚mޘ+eU㝅n~L;.f?I7}߾6ӻH]WXѺu-ZnwJ7;i1oB:q/8gIcIDATic]E< (I6kju#)[l ?r0O?n:~KRSS7l`~-t#vK{uPiM{;UdsKܮOvh6Wf(ȢnݺݹwDD=yQOD=yBƌ3tذ7~VZ+W0X,=S0sɓ'߽w﷽{ݿoٞDƘ;s*O.I_O-U&'%?K}e;t{پC;wUvQn _oɯk ?w`HJu>]^H{dϮUV+AR9sw>}9}R20.V=vFƍ+CQQw|suUE"jTJ}qĨG,GGyT޻׾}&7n}[oweLzPpO=z…׉Nݺ4sH[6/@" m/ >ElO]y󜝜͛w1mO[Ӫ4O3nˉzNWks42/}/1|[{蘝enrĉZىfL~U_:`>|2K$2ƼOف7|sjr$v n<'1)%.&;WkXX YbjbqV{ ,X|ի'I;߉KkӠAs8`dj"V4zx칆 dn2υsuM30 >lj 9wl>+C2_TsيJMrcu D 9u_c_e|iϝM&.I>ȑ=b:zEL9;wӨg,-R; ϹH!QŦL8*JeIII}Bh.|>xAp&55՜:3#'MM!/q֫WtZ:85u=(Fmy2q}m' OOE"=p5?Z`"/ f iƍСcIpV^f~>j}úk Du}ݺwɫZ%jťW7/SDQjLg炑)223u1XtɴӶ֩Sj͜?z߀'~çKuC{'kDQۯ/oiwftPz ~Ϝ㳰as v =1iO'Mj>+iXib83+@$&y܎YzS2<;r D %d`X<Ϥ9Xμ3> @kD~Lf gL|\\͚5 !>Ŭ:٥fZ8"YNFn7j?#6S\lў-xͷ-P/-[67N2{m:88lْYp >ryuy&Bȕ+ΝwjsȌ<8>e |iu|vnöp2o^6_}4kŋ^pS7o[_pܡ~m۶ So3ۺ_0}Wo>lػz>yW\i{z51QNZZڿ^|dR8NZj ?o#\bGӦMyvvf’¯U ^>dQoĩ \ˆ낪*4T&BEj2VZӦ.sOEҍ+ V$.6[9;%ʾ(F3τ2UpNN3yIB>^ȳ <,Ͼ ƨ5'OL>HXtyz<}Ŋ={4–JKhs|c*Z}>3rm 9l=䔔= 7~=@J,\[T~۷+/^ԕ3}Ϟ1hId铛4asxB'6Q͠fjSG^v0JvƺuFNз_߹9^ۊnixRlrndId wS߽z|nݧϱcLL334fsk׮ݧ?fCvlJKͧj.[y,+FUT11sW@03}]l̬+WwJ+s|[.#<ogǦM(lԨQ~>tXrJJ-oc"мE{ɓ'wLi^=wvb!W{7^l/vv=%/Lj#֋mX> lgg-[ܱ^e~\rL:b<,Ztɼy 6o,JGu9ͭ##ԩIbccky{Yڒ=1Sqf~O$~ל6mx˖FGxy\dIMz|ڃ;vu|j[~ۧD1)O!qmv5nZb G7w~}z/_rС`|`tQ83bĈeK~تUR…Ξt%Sٚv \?֭Bٯ.Q0tBgM.]/_>wss;`al_a ZS}q;svJ&;; jguhXa իW;wW(4kn>|UB΃w$PF @Q[Y[a/..k_<ۻ0ϥBMkoߺն];6mvvjFhs?5P VtO"cJ)! $Ez[J`OPLTFmƁbf|?Ü YC"g\t5سY{יMqoۯn89EY4d9QA9< <ډJυ`.l K_,px@ݣ}T<_ͭe]{wZT ]සj̧߲ }_5ЫEZgӅgggڵss- e{Q@(u:@ڡ>?T,f?̫fMϝX|J lx97NN+U7ˍ\3q922. S( ,EQ@MQlZL\g&*,[RO"c c5J)|ѽTX=V߽,BJXiذ! &+97!sAg/b-:z;IJJZ+P%w^hVL]EnfZzfL⽷UZ;ei7Qoߩ_ZeXõyx~ >&=M6r C僢;Z Võ6ٓȘcwb˾8\鿻"R*eKa$KU] 55 ///666%5׻Vnʽx<""RRF xbNO"c{ ?AE`; YYM999II)))999UsppH$n2vX9=1b24~?D\.)?? %X3>oooMvX9=1br4x#EQ&o=6lbfO"c{ ?AE`;r$wX]m Cj Bg!l3BB![ !-xB`tuదw~>!PU\3cN6*ORuˡ.FeaHC!d0/7n|Z$`(LWhO>h'+!Q| p+ϳ|-AAՕWCB\idQ0IENDB`knc105/doc/en/new-en.png0000644000175000017500000015053111436653777013243 0ustar dandanPNG  IHDR`n pHYs&cu$tEXtDescriptionWindow Class: knutclientVtEXtTitleKNutClient <2>? IDATx]w|?777&) 5z *V@EB*>JS}=OP@QTz =^ݻcvggM7Q|3g̜Ι]qBcىR bg nLOѵkB~sVl-Ɨb݆m)IC+cZa\=J"@c ev+}IͩT10zj@TҌr80,:;;Y.$lD@׮\ZᵢFx0dOַD {*Y{Ml5qVDL*1K8BT,VNx%ړ" _L ƕhitBȰк6 lNrX ظҰH-1^UҶQ%\KծcM"IdhU!%I74?=e 槵PtLFCLqoj6[k%{3T-mHJ/(re='!^+c]vW-˓_Td]@GN4sZq~J* W٩dOItWIYĞ*&#e`ʐYAE?$Z5]",GI*)%a,ohscJc>qQmP=bufUS/T$RScԎ4S{3L\rAkx8١p݅!!!@:}nnbv  ![-nE@mzݬa54!¢ࠠ`IAzeu :+DJyɍ׶4ꅧˣӏ$ r^tF΍ࠐZBCB$e5VZ:vnڲWn%5VF\eu070v]ldnLsW]eIC%SbvTK@ѪNNA())>\lvbFEE׫Khh(DHiiɅ tB"# %ۻ׉*MpAOQ !v^7/~+ݩhERl6[iijՊO xx6 =ԅQAvi^Vf~=ѣN v7nܤE˖ QTE,*_("%"$!AP'4PCL9z*(͐k(Ú1Dh;diK-C}@rN&S5EXeVMYiE[RNbŌk_ubJRA̸v!٪Uz{<nlqa+!-[JLH!YҟH239"=hBjUm"2*n(<]`Svf='OnٲdjIJ&7[ZA`.'N[[G\Mzȑ_~9vm7iTbI&V&Ч`*#_`\+(6^A{J]`#̪8 a)aA;5.L&File &Settings &Connection knc105/src/knutconst.h0000644000175000017500000000576011436653645013162 0ustar dandan/*************************************************************************** knutconst.h - description ------------------- begin : Tue Sep 24 2001 copyright : (C) 2003 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTCONST_H #define KNUTCONST_H #include namespace knc { const int StartPort =1024; const int StopPort= 65535; const int MinDelay = 2000; const int MinCols = 1; const int MaxCols = 5; const int DefaultCountCols = 3; // prednastaveny pocet sloupcu analogovych meraku const int DefaultPort = 3493; // default ports - prednastaveny port const int DefaultDelay = 2000; //2000 msec const int DefaultInputVoltage = 230; const int DefaultInputFrequency = 50; const int NumberOfTypes = 16; // count types of variables // pocet typu promenych (none,utility ....) const int NumberOfVars = NumberOfTypes -1; // how many variables we can measure // kolik promenych muzeme merit enum {VarNone, // none VarInVolt, //input.voltage VarBattPct, //battery.charge VarUpsTemp, //ups.temperature VarInFreq, //input.frequency VarUpsLoad, //ups.load VarAmbTemp, //ambient.temperature VarAmbHumid, //ambient.humidity VarBattVolt, //battery.voltage VarOutVolt, //output.voltage VarOutCurrent, //output.current VarOutFreq, //output.frequency VarBattTemp, //battery.temperature VarBattCurrent, //battery.current VarInCurrent, //input.current VarUpsPower }; //ups.power const int maxCountKNutEvent = 100; const int numberVarError = -1000; const QColor defaultBGColor = Qt::lightGray; const QColor defaultOkColor = Qt::green; const QColor defaultFingerColor = Qt::black; const QColor defaultWarnningColor = Qt::yellow; const QColor defaultErrorColor = Qt::red; const QColor defaultScaleColor = Qt::black; const QColor defaultFontColor = Qt::black; const QColor defaultKIconColor = Qt::white; enum upsDriverConnection { // state of connection to usbd, this isn't state of knutnet connecting, connected, stale, notConnected, error }; enum mainWindowStartVariant{ mw_yes=0, mw_no, mw_auto }; } #endif knc105/src/knutrwvar.cpp0000644000175000017500000001556111436653645013530 0ustar dandan/*************************************************************************** knutrwvar.cpp - description ------------------- begin : So rj 26 2002 copyright : (C) 2002 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutrwvar.h" #include "knutvardata.h" #include #include #include #include #include #include //#include KNutRWVar::KNutRWVar(QString* oldUserName, QString* oldPassword, const QString userName, const QString password, KNutNet* const upsNet, QWidget* parent) : KDialog(parent), m_upsNet(upsNet), m_oldUserName(oldUserName), m_oldPassword(oldPassword) { upsVarDef upsVar; qDebug ("KNutRWVar::KNutRWVar"); if (!m_upsNet) return; setCaption( i18n("UPS variables") ); setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Default ); setButtonText(KDialog::User1,i18n("Reload Vars")); m_upsConnectOk = true; QWidget *mainWidget = new QWidget (this); setMainWidget( mainWidget); QVBoxLayout *topLayout = new QVBoxLayout( mainWidget ); QLabel *label1 = new QLabel (i18n("SET RW VARIABLE"),mainWidget); label1->setAlignment(Qt::AlignHCenter); topLayout->addWidget(label1); QLabel *label2 = new QLabel (i18n("Variable:"),mainWidget); m_rWVarBox = new KComboBox(mainWidget); QLabel *label3 = new QLabel (i18n("Value:"),mainWidget); m_valueVarBox = new KComboBox(mainWidget); m_valueVarLine = new KLineEdit(mainWidget); m_valueVarLine->hide(); m_passLayout = new QGridLayout(); QLabel *labelName = new QLabel (i18n("User name:"),mainWidget); QLabel *labelPassword = new QLabel (i18n("Password:"),mainWidget); m_lineEditName = new KLineEdit( mainWidget ); m_lineEditPassword = new KLineEdit( mainWidget ); if (((*m_oldUserName) == "") && ((*m_oldPassword) == "")) { m_lineEditName->setText(userName); m_lineEditPassword->setText(password); } else { m_lineEditName->setText(*m_oldUserName); m_lineEditPassword->setText(*m_oldPassword); } if (!((*m_oldUserName) == "") || !((*m_oldPassword) == "")) { m_lineEditName->setDisabled(true); m_lineEditPassword->setDisabled(true); } m_lineEditPassword->setEchoMode(QLineEdit::Password); topLayout->addLayout(m_passLayout); m_passLayout->addWidget(label2,0,0); m_passLayout->addWidget(m_rWVarBox,0,1); m_passLayout->addWidget(label3,1,0); m_passLayout->addWidget(labelName,2,0); m_passLayout->addWidget(labelPassword,3,0); m_passLayout->addWidget(m_lineEditName,2,1); m_passLayout->addWidget(m_lineEditPassword,3,1); topLayout->addStretch(10); //loads ComboBox int n = m_upsNet->readNumberVars( KNutNet::RWVars ); if ( n != -1) { for (int i =0; i < n ; i++) { if (!m_upsNet->readVars(i, upsVar,KNutNet::RWVars)) m_rWVarBox->addItem(upsVar.upsVarName); } slotChangeVar(0); } else { // error m_passLayout->addWidget(m_valueVarLine,1,1); m_valueVarLine->setMaxLength(upsVar.upsVarMax); m_valueVarBox->hide(); m_valueVarLine->show(); m_upsValueType=true; } connect (m_rWVarBox,SIGNAL(activated(int)),this,SLOT(slotChangeVar(int))); connect( this, SIGNAL( defaultClicked() ), this, SLOT( slotDefault() ) ); connect( this, SIGNAL( okClicked() ), this, SLOT( slotOk() ) ); } void KNutRWVar::slotDefault () { upsVarDef upsVar; int error; qDebug("KNutRWVar::slotDefault"); QString varName = m_rWVarBox->currentText(); if (!( error = m_upsNet->readVars(varName,upsVar))) { if (upsVar.upsValueType) m_valueVarLine->setText(upsVar.upsValue); else m_valueVarBox->setCurrentItem(upsVar.upsValue); } else emit signalShowMessage(KNutVarData::errorToText (error),"rwerrors_event"); } void KNutRWVar::slotChangeVar(int item) { upsVarDef upsVar; QString varName = m_rWVarBox->itemText(item); int error = m_upsNet->readVars(varName,upsVar); m_upsValueType=upsVar.upsValueType; if (error || (upsVar.upsValueType)) { // char m_valueVarBox->hide(); m_valueVarLine->show(); m_passLayout->addWidget(m_valueVarLine,1,1); // add char box into layout m_valueVarLine->setText(upsVar.upsValue); } else { //enum m_valueVarLine->hide(); m_valueVarBox->show(); m_passLayout->addWidget(m_valueVarBox,1,1); // add ValueVarBox into layout m_valueVarBox->clear(); if (upsVar.upsVarMax) { for (int i = 0 ; i < upsVar.upsVarMax; i++) m_valueVarBox->addItem(m_upsNet->readEnumValueVar(upsVar.upsVarName,i+1)); } m_valueVarBox->setCurrentItem(upsVar.upsValue); } } KNutRWVar::~KNutRWVar(){ } //bool KNutRWVar::isUpsOk (void) { return m_upsConnectOk; } void KNutRWVar::slotOk() { QString value; int error =0; if (m_upsValueType) value=m_valueVarLine->text(); else value=m_valueVarBox->currentText(); if (((*m_oldUserName) == "") && ((*m_oldPassword) == "")) { //the first connection sets name and password //prvni propojeni nastavime jmeno a heslo if (!(error = m_upsNet->setVariable(m_rWVarBox->currentText(), value, m_lineEditName->text(),m_lineEditPassword->text(),false))) { // vzhledem k asynchronimu spracovani asi zbytecne // emit signalChangeRWVars(m_rWVarBox->currentText());//emits command for loading of variable and repaint of panel (*m_oldUserName) = m_lineEditName->text(); (*m_oldPassword) = m_lineEditPassword->text(); accept(); return; } } else { qDebug("KNutRWVar::slotOk() - second connection"); if (((*m_oldUserName) == m_lineEditName->text()) && ((*m_oldPassword) == m_lineEditPassword->text())) { if (!(error = m_upsNet->setVariable(m_rWVarBox->currentText(), value, m_lineEditName->text(),m_lineEditPassword->text(),true))) { // next line isn't needed, maybe // vzhledem k asynchronimu spracovani asi zbytecne // emit signalChangeRWVars(m_rWVarBox->currentText()); //emits command for loading of variable and repaint of panel accept(); return; } } } //Nahlasime chybu // sends information about error emit signalShowMessage(KNutVarData::errorToText (error),"rwerrors_event"); } #include "knutrwvar.moc" knc105/src/CMakeLists.txt0000644000175000017500000000205211436653645013510 0ustar dandanadd_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) ADD_DEFINITIONS( -DQT_NO_DEBUG_OUTPUT ) include (KDE4Defaults) include_directories( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES}) set(knutclient_SRCS knutclient.cpp main.cpp knutupsdata.cpp knutvardata.cpp knutnet.cpp knutfrontpanel.cpp knutpanelmeter.cpp knutanalog.cpp knutnewupsdlg.cpp knutprefdlg.cpp knutdock.cpp knutmainwindow.cpp knutprintupsvar.cpp knutrwvar.cpp knutinstcomms.cpp ) #kde4_automoc(${knutclient_SRCS}) #kde4_add_kcfg_files(knutclient_SRCS settings.kcfgc ) kde4_add_executable(knutclient ${knutclient_SRCS}) target_link_libraries(knutclient ${KDE4_KDEUI_LIBS} ${KDE4_KDECORE_LIBS} ${QT_QTNETWORK_LIBRARIES} ) install(TARGETS knutclient DESTINATION ${BIN_INSTALL_DIR} ) ########### install files ############### #install( FILES knutclient.kcfg DESTINATION ${KCFG_INSTALL_DIR} ) install( FILES knutclientui.rc DESTINATION ${DATA_INSTALL_DIR}/knutclient ) knc105/src/knutnet.cpp0000644000175000017500000016350111436653645013153 0ustar dandan/*************************************************************************** knutnet.cpp - description ------------------- begin : Ne led 12 2003 copyright : (C) 2003 by Daniel Prynych email : Daniel at Prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutnet.h" #include #include #include #include #include //#include KNutNet::KNutNet (const QString upsAddress, const QString upsName, const unsigned short port, unsigned int countRepeat, const unsigned int delay) : QObject(), m_upsAddress(upsAddress), m_upsName(upsName), m_countRepeat(countRepeat), m_port(port), m_delay(delay) { qDebug ("KNutNet::Constructor"); m_state = Idle; //idle is value m_numberVars = 0; m_numberRWVars = 0; m_numberIComms = 0; m_upsStatusVar = 0; m_nutProtocol = 0; m_nutVariables = versionVarUnknown; m_switchToTCP = false; m_description = false; // popis neni natazen - description is not loaded m_unConnectTimer = new QTimer( this ); connect( m_unConnectTimer, SIGNAL(timeout()), this, SLOT(slotTimerReconnect()) ); m_errorState = NoError; m_commandSocket = new QTcpSocket( this ); connect( m_commandSocket, SIGNAL( hostFound()),this, SLOT( slotHostFound())); connect( m_commandSocket, SIGNAL( connected()),this,SLOT( slotConnected())); connect( m_commandSocket, SIGNAL( disconnected()),this,SLOT( slotDisconnected())); connect( m_commandSocket, SIGNAL( error(QAbstractSocket::SocketError)),this, SLOT( slotConnectionError(QAbstractSocket::SocketError))); } KNutNet::~KNutNet(){ // doesn't run slotDisconnected when class is ended disconnect( m_commandSocket, SIGNAL( disconnected()),this,SLOT( slotDisconnected())); close(); // close connetion when is existed m_state = UnConnected ; // deleteVars() is made in close(); } void KNutNet::slotDisconnected (void) { m_state = UnConnected ; m_unConnectTimer->stop(); // emit connectionClosed(); } void KNutNet::close (void) { qDebug("KNutNet::close %d",m_state); QByteArray inBuffer; QString outBuffer; m_unConnectTimer->stop(); deleteVars(); if ((m_state == Connected) || (m_state == Connecting)) { m_state = Closing; if (m_state == Connected) { inBuffer="LOGOUT\n"; getUpsData (inBuffer,outBuffer); // getUpsDate makes "commandSocket->flush()" } if (m_commandSocket->bytesToWrite() > 0) KNutSleep::msleep(1000); m_commandSocket->abort(); // closes the socket m_state = UnConnected; } } void KNutNet::open (void) { qDebug ("KNutNet::open %d", m_state); while (m_state == HostLookup ) { KNutSleep::msleep(100); } if ((m_state == Connected) || (m_state == Connecting)) close(); // close connetion when is existed else { while (m_state == Closing ) { KNutSleep::msleep(100); } } if (m_upsAddress != "") { if ( m_commandSocket->state() != QAbstractSocket::ConnectingState ) { m_firstConnect=true; m_numberConnection=0; m_state = HostLookup; emit tryFirstConnection(m_countRepeat); // how many times we can try to connect with ups server /upsd/ m_commandSocket->connectToHost(m_upsAddress,m_port); } } } void KNutNet::newUPS (const QString upsAddress, const QString upsName, const unsigned short port) { qDebug("KNutNet::newUPS"); if ((m_state == Connected) || (m_state == Connecting)) { close(); while (m_state == Closing ) { KNutSleep::msleep(100); } } m_upsAddress = upsAddress; m_upsName = upsName; m_port = port; m_state = Idle; m_numberVars = 0; m_numberRWVars = 0; m_numberIComms = 0; m_upsStatusVar = 0; m_nutProtocol = 0; m_nutVariables = versionVarUnknown; m_switchToTCP = false; m_errorState = NoError; //firstConnect=true; //numberConnection=0; } //int KNutNet::getState ( void ){ return m_state; } bool KNutNet::isDescription ( void ){ return m_description; } int KNutNet::getNutProtocol ( void ) { return m_nutProtocol; } KNutNet::nutVarVersion KNutNet::getNutVariables ( void ) { if ((m_nutVariables < 1) || (m_nutVariables > 2)) { return versionVarOne; } else { return (nutVarVersion)m_nutVariables; } } bool KNutNet::switchedToTCP ( void ) { return m_switchToTCP; } KNutNet::NetError KNutNet::getUpsVars ( void) { qDebug("int KNutNet::getUpsVars"); NetError returnValue; m_errorState=NoError; if (m_state == Connected) { // init vars and lists m_numberVars = 0; m_numberRWVars = 0; m_numberIComms = 0; deleteVars(); int countWaitRevision = 5; do { switch (m_nutProtocol) { case 1: returnValue = getUpsVars1(); break; case 2: returnValue = getUpsVars2(); break; default: return NoError; } if ( readStatus() != KNutNet::WAIT) return returnValue; countWaitRevision--; if (countWaitRevision) KNutSleep::msleep(2); } while (countWaitRevision); return NoListVars; //getUpsVars can't read list variables } else { return NotConnection; } } KNutNet::NetError KNutNet::getUpsValues (const bool allVars ) {// allVars = true vse; allVars = false jen activate qDebug("KNutNet::getUpsValues"); m_errorState=NoError; // vynulujeme chyby if (m_state == Connected) { // init vars and lists switch (m_nutProtocol) { case 1: return getUpsValues1(allVars); break; case 2: return getUpsValues2(allVars); break; default: return NoError; } } else { return NotConnection; } } int KNutNet::getDescription (bool always) { m_errorState=NoError; // vynulujeme chyby if (m_state == Connected) { switch (m_nutProtocol) { case 1: return getDescription1 (always); break; case 2: return getDescription2 (always); break; default: return 0; } } else return NotConnection; } int KNutNet::instantCommand (const QString command, const QString userName, const QString password, const bool onlyCommand) { m_errorState=NoError; // vynulujeme chyby if (m_state == Connected) { QString outBuffer; // funkce sendComm sama mastavi promenou error if (onlyCommand) { if (!(m_errorState = sendComm("INSTCMD", command, "",true))) { // netMutex=false; return 0; } else { // netMutex=false; return m_errorState; } } else { if (!(m_errorState = sendComm ("USERNAME", userName, ""))) { if (!(m_errorState = sendComm("PASSWORD", password, ""))) { if (!(m_errorState = sendComm("INSTCMD", command, "",true))) { // netMutex=false; return 0; } else { return m_errorState; // spatny prikaz wrong command } } //username else { return m_errorState; //spatne heslo - wrong password } } else { return m_errorState; // spatne jmeno wrong name } } } else return NotConnection; } int KNutNet::setVariable (const QString variable, const QString value, const QString userName, const QString password, const bool onlyVariable) { m_errorState=NoError; // vynulujeme chyby if (m_state == Connected) { QString outBuffer; QString setCommand; switch (m_nutProtocol) { case 1: setCommand = "SET"; break; case 2: setCommand = "SET VAR"; } if (onlyVariable) { if (!(m_errorState = sendComm(setCommand, variable, value, true))) { return 0; } else { return m_errorState; } } else { if (!(m_errorState = sendComm ("USERNAME", userName, ""))) { if (!(m_errorState = sendComm("PASSWORD", password, ""))) { if (!(m_errorState = sendComm(setCommand, variable, value, true))) { //netMutex=false; return 0; } else { return m_errorState; } } //username else { return m_errorState; } } else { return m_errorState; } } } else return NotConnection; } int KNutNet::readNumberVars (typeOfVar typVar) { // Vraci pocet promenych m_errorState=NoError; if (m_state == Connected) { switch (typVar) { case AllVars: return m_numberVars; break; case ROVars: return m_numberVars - m_numberRWVars; break; case RWVars: return m_numberRWVars; break; default: return -1; } } else return -1; } int KNutNet::readNumberComms (void) { // Vraci pocet prikazu m_errorState=NoError; if (m_state == Connected) return m_numberIComms; else return -1; } int KNutNet::readIComm (const int seqNumber, upsICommDef& upsIComm) { m_errorState =NoError; if (m_state == Connected) { // if ((seqNumber < 1) || ((unsigned int)seqNumber > m_listIComms.size())) { if ((seqNumber < 1) || (seqNumber > m_listIComms.size())) { m_errorState=CommNotFind; return m_errorState; } upsIComm = m_listIComms[seqNumber-1]; return 0; } else return NotConnection; } int KNutNet::readVars (const QString name, struct upsVarDef& allVar) { m_errorState =NoError; if (m_state == Connected) { QVector::const_iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { if ((*it).upsVarName == name) { allVar = (*it); return 0; } } m_errorState=VarNotFind; return m_errorState; } else return NotConnection; } int KNutNet::readVars (const int seqNumber, struct upsVarDef& allVar, const typeOfVar typVar) { m_errorState =NoError; if (m_state == Connected) { int n = 1; QVector::const_iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { if ((typVar== AllVars) || ((typVar==ROVars) && ((*it).upsVarType)) || ((typVar==RWVars) && (!(*it).upsVarType))) { if (n == seqNumber) { allVar = (*it); return 0; } n++; } } m_errorState=VarNotFind; return m_errorState; } else return NotConnection; } QString KNutNet::readStringVar (const QString name) { m_errorState =NoError; if (m_state == Connected) { QVector::const_iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { if ((*it).upsVarName == name) return (*it).upsValue; } m_errorState = VarNotFind; return 0l; } else return 0l; } QString KNutNet::readEnumValueVar (const QString name, const int valueNumber) { m_errorState =NoError; if (m_state == Connected) { QVector::const_iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { if ((*it).upsVarName == name) { if ((valueNumber < 1) || (valueNumber > (*it).upsVarMax)) { m_errorState=EnumValueNotFind; return 0l; } // vratime hodnotu return (*(*it).upsEnumValues)[valueNumber-1]; } } m_errorState = VarNotFind; return 0; } else return 0; } int KNutNet::readStatus(void) { qDebug ("KNutNet::readStatus %d",m_upsStatusVar); m_errorState=NoError; return m_upsStatusVar; } int KNutNet::existName ( const QString name ) { m_errorState =NoError; if (m_state == Connected) { QVector::const_iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { if ((*it).upsVarName == name) return 0; } m_errorState = VarNotFind; return m_errorState; } else return NotConnection; } /*************************************************************************/ /* */ /* PRIVATE FUNCTIONS */ /* */ /*************************************************************************/ int KNutNet::version (int countRepeat, const int delay) { qDebug("KNutNet::version"); QByteArray inBuffer; QString outBuffer; m_errorState =NoError; do { inBuffer="VER\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer)) == NoError) { outBuffer=outBuffer.trimmed(); if (outBuffer.length() > 0) { outBuffer = outBuffer.mid(outBuffer.indexOf("upsd")+4); int n = outBuffer.indexOf("."); if (n > 0) { QString firstNumber= outBuffer.left(n); QString secondNumber= outBuffer.mid(n+1); int n = secondNumber.indexOf("."); if (n > 0) { bool ok; secondNumber = secondNumber.left(n); int secondInt = secondNumber.toInt(&ok); if (!ok) {m_errorState = UnknownFormatVer; return m_errorState;} int firstInt = firstNumber.toInt(&ok); if (!ok) {m_errorState = UnknownFormatVer; return m_errorState;} if ((firstInt == 0) || ((firstInt == 1) && (secondInt < 3))) { m_nutProtocol =1; m_nutVariables =versionVarOne; } else { m_nutProtocol =2; m_nutVariables =versionVarTwo; } return 0; } else m_errorState = UnknownFormatVer; // n is <= 0 the second dot } else m_errorState = UnknownFormatVer; // n is <= 0 the first dot } m_errorState = UnknownAnswer; // i cannot specify number of protocol and number of variables return m_errorState; } qDebug("KNutNet::version after get error %d",countRepeat); countRepeat--; if (countRepeat) KNutSleep::msleep (delay); } while ((countRepeat)); return m_errorState; } KNutNet::NetError KNutNet::getFirstUpsName (QString& firstUpsName) { QByteArray inBuffer; QString outBuffer; QString varOutBuffer; int lenString; m_errorState=NoError; inBuffer = "LIST UPS\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer,"END LIST UPS"))== NoError) { QString inLine, upsNameRet, varName, value; int key, typeValue; bool beginList = false; QTextStream varInputStream(&outBuffer); while (!(inLine = varInputStream.readLine()).isNull()) { key = parseLine (inLine, upsNameRet, varName, value, typeValue, lenString); switch (key) { case BEGIN_LIST_UPS: { beginList = true;; break; } case UPS: if (beginList ) { firstUpsName = upsNameRet; return NoError; } case END_LIST_UPS: firstUpsName = ""; m_errorState=NoUpsHere; return m_errorState; case ERR: m_errorState = upsTranslateError(value); return m_errorState; default: m_errorState=UnknownAnswer; return m_errorState; } }// end while } else { m_errorState=NoData; return m_errorState; } //for compiler only return NoError; } int KNutNet::setKey (const QString line) { QString myLine=line.trimmed(); if (myLine == "OK") return OK; if (myLine == "ERR") return ERR; if (myLine == "BEGIN") return BEGIN; if (myLine == "END") return END; if (myLine == "VAR") return VAR; if (myLine == "TYPE") return TYPE; if (myLine == "DESC") return DESC; if (myLine == "CMDDESC") return CMDDESC; if (myLine == "UPSDESC") return CMDDESC; if (myLine == "UPS") return UPS; if (myLine == "LIST") return LIST; if (myLine == "RW") return RW; if (myLine == "CMD") return CMD; if (myLine == "ENUM") return ENUM; if (myLine == "STARTTLS") return STARTTLS; return NONE; } QString KNutNet::parseValue (const QString line) { if (line.isEmpty()) return ""; if (line[0] != QChar('\"')) { if ((m_posChar=line.indexOf(' ')) == -1) return line; else return line.left(m_posChar+1); } else { int len = line.length(); QString outString = ""; for (int i=1; i < len; i++) { if ( line[i] == QChar('\\')) { if ((i+1) > word; if (word == "RW") ret += RW_FLAG; if (word == "ENUM") ret += ENUM_FLAG; if (word.indexOf("STRING:") != -1) { word = word.mid(7); ret += STRING_FLAG; lenString = word.toInt(); } } return ret; } int KNutNet::parseLine(QString& line, QString& upsName ,QString& varName, QString& value, int& typeValue, int& lenString) { int posChar; QString word1, word2, word3; int key1, key2, key3; line = line.trimmed(); upsName = ""; varName = ""; value = ""; typeValue =0; if (line.isEmpty()) return NONE; if ((posChar=line.indexOf(' ')) == -1) { if (setKey(line) == OK) return OK; else return NONE; } else { key1 = setKey( line.left(posChar)); line = line.mid(posChar+1); switch (key1) { case NONE: return key1; case OK: return key1; case ERR: value = parseValue(line); return key1; default: if ((posChar=line.indexOf(' ')) == -1) return NONE; word2 = line.left(posChar); key2 = setKey( word2); line = line.mid(posChar+1); switch (key1) { case BEGIN: if ((key2 == LIST) && (setKey(line) == UPS)) return BEGIN_LIST_UPS; break; case END: if ((key2 == LIST) && (setKey(line) == UPS)) return END_LIST_UPS; break; case UPS: upsName = word2; value = parseValue(line); return key1; case CMD: upsName = word2; varName = parseValue(line); return key1; } if ((posChar=line.indexOf(' ')) == -1) return NONE; word3 = line.left(posChar); key3 = setKey( word3); line = line.mid(posChar+1); switch (key1) { case VAR: upsName = word2; varName = word3; value = parseValue(line); return VAR; case TYPE: upsName = word2; varName = word3; typeValue = parseTypeValue(line,lenString); return TYPE; case ENUM: upsName = word2; varName = word3; value = parseValue(line); return ENUM; case DESC: upsName = word2; varName = word3; value = parseValue(line); return DESC; case CMDDESC: upsName = word2; varName = word3; value = parseValue(line); return CMDDESC; case BEGIN: if (key2 != LIST) return NONE; if (key3 == VAR) { upsName=line.trimmed(); return BEGIN_LIST_VAR; } if (key3 == RW) { upsName=line.trimmed(); return BEGIN_LIST_RW; } if (key3 == CMD) { upsName=line.trimmed(); return BEGIN_LIST_CMD; } if (key3 == ENUM) { if ((posChar=line.indexOf(' ')) == -1) return NONE; upsName = line.left(posChar); line=line.mid(posChar+1); varName = line.trimmed(); return BEGIN_LIST_ENUM; } return NONE; case END: if (key2 != LIST) return NONE; if (key3 == VAR) { upsName=line.trimmed(); return END_LIST_VAR; } if (key3 == RW) { upsName=line.trimmed(); return END_LIST_RW; } if (key3 == CMD) { upsName=line.trimmed(); return END_LIST_CMD; } if (key3 == ENUM) { if ((posChar=line.indexOf(' ')) == -1) return NONE; upsName = line.left(posChar); line=line.mid(posChar+1); varName = line.trimmed(); return END_LIST_ENUM; } return NONE; default: return NONE; } } } } KNutNet::NetError KNutNet::newDescription (const QByteArray inBuffer, QString& upsDescription) { QString outBuffer; if ((m_errorState=getUpsData (inBuffer,outBuffer))== NoError) { outBuffer=outBuffer.trimmed(); QString word1, word2, word3; if ((m_posChar = outBuffer.indexOf(' ')) == -1) word1 = outBuffer; else { word1 = outBuffer.left(m_posChar); word2 = outBuffer.mid(m_posChar+1); } if (word1 == "DESC") { if ((m_posChar = word2.indexOf('\"')) == -1) word3=""; else { word3 = word2.mid(m_posChar+1); if ((m_posChar = word3.indexOf('\"')) != -1) word3=word3.left(m_posChar); } if (!word3.isEmpty()) upsDescription=word3; } else { if (word1 == "ERR" ) return upsTranslateError(word2); else return UnknownAnswer; } } else return m_errorState; return NoError; } void KNutNet::cleanConnecting (void) { qint64 rMaxLen; QByteArray recvBuffer; qint64 lengthInputData; int n = 0; while (m_commandSocket->bytesAvailable() > 0) { if ( (m_commandSocket->bytesAvailable()+1) > rBufferLen) rMaxLen = rBufferLen; else rMaxLen=m_commandSocket->bytesAvailable()+1; recvBuffer.resize(rMaxLen); if ((lengthInputData = m_commandSocket->read(recvBuffer.data(),rMaxLen)) == -1) { break; } if (lengthInputData == 0) break; if (n > 20) break; else n++; } } KNutNet::NetError KNutNet::getUpsData (const QByteArray sBuffer, QString& rBuffer, const QByteArray endString) { //rbufferLen a sbufferLen are maximal value of buffers QByteArray recvBuffer; qint64 lengthInputData; qint64 dataAvailable; QMutexLocker getUpsDataLocker( &m_getUpsDataMutex ); cleanConnecting(); // first we clean input TCP buffer //cleans buffer rBuffer=""; // clean main input buffer; // after write block, runs command flush for sending data to server inmediately if (m_commandSocket->write(sBuffer.data(),sBuffer.length()) < 0 ) return SendErr; m_commandSocket->flush(); //waiting for data if (!(m_commandSocket->waitForReadyRead(1500))) { if (m_errorState != NoError) { return m_errorState; } } // gets data bool endRecv = false; do { dataAvailable=m_commandSocket->bytesAvailable(); if (recvBuffer.size() < (dataAvailable+1) ) recvBuffer.resize(dataAvailable+1); if ((lengthInputData = m_commandSocket->read(recvBuffer.data(),dataAvailable)) == -1) return RecvErr; //correct for X86_64 by Alexey Sidorov recvBuffer[(int)lengthInputData]='\0'; //Problem is that //for 64bit environment is Q_LONG defined like _int64 and //for other environments is Q_LONG defined like long rBuffer.append(recvBuffer.data()); // adds reading data to main input buffer if (endString.isEmpty()) endRecv = false; else { if (recvBuffer.lastIndexOf(endString) == -1) { //doesn't find right end of input data if (m_commandSocket->bytesAvailable() == 0) { if (!(m_commandSocket->waitForReadyRead(1000))) { if (m_errorState != NoError) { return m_errorState; } } } if (m_commandSocket->bytesAvailable() > 0) endRecv=true; // makes other cyckle of while else endRecv=false; } //finds right end of input data else endRecv = false; // we have found what we want to find } } while (endRecv); return NoError; // all is OK } void KNutNet::setRWVars (const QString varName, const bool valueType, const int varMax, QVector* enumValues) { QVector::iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { if ((*it).upsVarName == varName) { (*it).upsVarMax = varMax; (*it).upsValueType=valueType; (*it).upsEnumValues=enumValues; (*it).upsVarType=false; break; } } } void KNutNet::upsSetType (struct upsVarDef& upsVar, const QString name, const QString value) { if (((m_nutVariables = versionVarTwo) && (name == "STATUS")) || ((m_nutVariables == versionVarOne) && (name == "ups.status"))) upsVar.upsVarActive=true; else upsVar.upsVarActive=false; upsVar.upsVarName = name; upsVar.upsVarType=true; upsVar.upsValueType=true; upsVar.upsVarMax=0; upsVar.upsValue=value; upsVar.upsDescription=""; upsVar.upsEnumValues=NULL; } void KNutNet::deleteVars (void) { QVector::iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { if ((*it).upsEnumValues != 0) { (*it).upsEnumValues->clear(); delete (*it).upsEnumValues; } } m_listVars.clear(); m_listIComms.clear(); } void KNutNet::genStatusFlags (QString value) { qDebug("KNutNet::genStatusFlags"); m_upsStatusVar = 0; QTextStream inputStream(&value); QString word; while (!inputStream.atEnd()) { inputStream >> word; if (word == "OFF") m_upsStatusVar +=OFF; if (word == "OL") m_upsStatusVar +=OL; if (word == "OB") m_upsStatusVar +=OB; if (word == "LB") m_upsStatusVar +=LB; if (word == "CAL") m_upsStatusVar +=CAL; if (word == "TRIM") m_upsStatusVar +=TRIM; if (word == "BOOST") m_upsStatusVar +=BOOST; if (word == "OVER") m_upsStatusVar +=OVER; if (word == "RB") m_upsStatusVar +=RB; if (word == "CHRG") m_upsStatusVar +=CHRG; if (word == "WAIT") m_upsStatusVar = WAIT; //OFF - 1 ups je vypnuta //OL - 2 ups je bezi na sit //OB - 4 ups bezi na baterie //LB - 8 baterie je vybita (pokud je zaroven OB dojde k shutdownu) //CAL - 16 je spustena kalibrace //OVER - 128 ups je pretizena //RB - 256 ups pozaduje vymenu baterie //WAIT - 512 ups zada o strpeni // UPS asks for waiting //CHRG - 1024 ups battery is charged } } int KNutNet::getDescription1 (bool always) { if (always || (! m_description)) { QByteArray inBuffer; QString outBuffer; QVector::iterator itv; QVector::iterator itc; for (itv = m_listVars.begin(); itv != m_listVars.end(); itv++) { //nacteme promenou inBuffer = "VARDESC "; inBuffer += (*itv).upsVarName.toLocal8Bit() + ('\n'); if ((m_errorState == newDescription (inBuffer, (*itv).upsDescription)) != NoError) { //netMutex.unlock(); //netMutex=false; return m_errorState; } } for (itc = m_listIComms.begin(); itc != m_listIComms.end(); itc++) { //nacteme promenou inBuffer = "INSTCMDDESC "; inBuffer += (*itc).upsCommName.toLocal8Bit()+"\n"; if ((m_errorState = newDescription (inBuffer, (*itc).upsDescription)) != NoError) { //netMutex.unlock(); //netMutex=false; return m_errorState; } } //netMutex=false; m_description = true; } return 0; } int KNutNet::getDescription2 (bool always) { if (always || (! m_description)) { QByteArray inBuffer; QString outBuffer; QString upsNameRet; QString varName; QString value; int typeValue; int lenString; QVector::iterator itv; QVector::iterator itc; for (itv = m_listVars.begin(); itv != m_listVars.end(); itv++) { //nacteme promenou inBuffer = "GET DESC "; inBuffer += m_upsName.toLocal8Bit() + " " + (*itv).upsVarName.toLocal8Bit() + "\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer)) == NoError) { outBuffer=outBuffer.trimmed(); if ( !outBuffer.isEmpty() ) { int key = parseLine(outBuffer, upsNameRet, varName, value, typeValue, lenString); switch (key) { case DESC: (*itv).upsDescription = value; break; case ERR: m_errorState=upsTranslateError(value); return m_errorState; default: m_errorState=UnknownAnswer; return m_errorState; } } else { m_errorState = NoData; return m_errorState; } } // end for else { return m_errorState; } } for (itc = m_listIComms.begin(); itc != m_listIComms.end(); itc++) { //nacteme promenou inBuffer = "GET CMDDESC "; inBuffer += m_upsName.toLocal8Bit() + " " + (*itc).upsCommName.toLocal8Bit()+"\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer)) == NoError) { outBuffer=outBuffer.trimmed(); if ( !outBuffer.isEmpty() ) { int key = parseLine(outBuffer, upsNameRet, varName, value, typeValue, lenString); switch (key) { case CMDDESC: (*itc).upsDescription = value; break; case ERR: m_errorState=upsTranslateError(value); return m_errorState; default: m_errorState=UnknownAnswer; return m_errorState; } } else { m_errorState = NoData; return m_errorState; } } else { return m_errorState; } } m_description = true; } return 0; } KNutNet::NetError KNutNet::getUpsVars1 ( void) { // getUpsVars nacte promene a jejich typ // vraci kod chyby nebo 0 pokud je vse v poradku QByteArray inBuffer; QString outBuffer; QString varOutBuffer; upsVarDef upsVar; upsICommDef upsIComm; // init vars and lists if (!m_upsName.isEmpty()) { // pokud upsName neni je vzdy nastaveno na null inBuffer="LISTVARS "; inBuffer += m_upsName.toLocal8Bit() + "\n"; } else inBuffer ="LISTVARS\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer)) == NoError) { outBuffer=outBuffer.trimmed(); if (outBuffer.length() > 0) { // precteme data QTextStream inputStream(&outBuffer); QString word; int count =1 ; while (!inputStream.atEnd()) { inputStream >> word; switch (count) { case 1: // vyndame prvni polozku if (word == "VARS") count++; else { if (word == "ERR") { inputStream >> word; m_errorState = upsTranslateError(word); } else m_errorState=UnknownAnswer; return m_errorState; } break; case 2: count++; if ((word.length() > 0) && word.startsWith("@")) break; default: // pridame polozku do tabulky upsSetType(upsVar, word); m_listVars.push_back(upsVar); m_numberVars++; break; } } } else { m_errorState=NoData; return m_errorState; } } else return m_errorState; if ((m_errorState = getUpsValues1(true))) return m_errorState; // *********** RW VARIABLES if (!m_upsName.isEmpty()) { // pokud upsName neni je vzdy nastaveno na null inBuffer="LISTRW "; inBuffer += m_upsName.toLocal8Bit() + "\n"; } else inBuffer ="LISTRW\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer)) == NoError) { outBuffer=outBuffer.trimmed(); if (!outBuffer.isEmpty()) { // precteme data QTextStream inputStream(&outBuffer); QString word; int count =1 ; bool valueType; int varMax; while (!inputStream.atEnd()) { inputStream >> word; switch (count) { case 1: // vyndame prvni polozku if (word == "RW") count++; else { if (word == "ERR") { inputStream >> word; m_errorState = upsTranslateError(word); } else m_errorState=UnknownAnswer; return m_errorState; } break; case 2: count++; if ((word.length() > 0) && word.startsWith("@")) break; default: // Zpracujeme polozku v tabulce // zjistime informaci o promene inBuffer="VARTYPE " + word.toLocal8Bit(); if (!m_upsName.isEmpty()) { inBuffer.append("@"); // pokud upsName neni je vzdy nastaveno na null inBuffer.append(m_upsName.toLocal8Bit()); } inBuffer.append("\n"); if ((m_errorState=getUpsData (inBuffer,varOutBuffer)) == NoError) { varOutBuffer=varOutBuffer.trimmed(); if ( !outBuffer.isEmpty() ) { QTextStream varInputStream(&varOutBuffer); QString word1, word2, word3; varInputStream >> word1; varInputStream >> word2; varInputStream >> word3; if (word1 == "TYPE") { if ((word2.isEmpty()) || (word3.isEmpty())) { m_errorState=UnknownFormat; return m_errorState; } if (word2 == "ENUM") valueType=false; else { if (word2 =="STRING") valueType=true; else { m_errorState=UnknownFormat; return m_errorState; } } bool ok = true; varMax=word3.toInt(&ok); if (!ok) {m_errorState=UnknownFormat; return m_errorState;}; } // word1 = Type else { if (word1=="ERR") { m_errorState = upsTranslateError(word2); return m_errorState; } else { m_errorState = UnknownAnswer; return m_errorState; } } } else { m_errorState=NoData; return m_errorState; } } else return m_errorState; // ********** ENUM / STRING ****************** QVector* enumString=0; if (!valueType) { // nacteme enum hodnoty inBuffer="ENUM " + word.toLocal8Bit(); // pokud existuje pridame jmeno UPS-ky if (!m_upsName.isEmpty()) { inBuffer.append("@"); inBuffer.append(m_upsName.toLocal8Bit()); } inBuffer.append("\n"); if ((m_errorState=getUpsData (inBuffer,varOutBuffer,"END\n")) == NoError) { // varOutBuffer.stripWhiteSpace(); nemuze provest protoze bychom si odstranili konce radek if (!varOutBuffer.isEmpty()) { QString inLine, word1, word2; QTextStream varInputStream(&varOutBuffer); int inCountLine=1; while (!(inLine = varInputStream.readLine()).isNull()) { inLine=inLine.trimmed(); if ((m_posChar=inLine.indexOf(' ')) == -1) word1=inLine; else { word1=inLine.left(m_posChar); inLine = inLine.mid(m_posChar+1); } if (word1.isEmpty()) { m_errorState = UnknownFormat; return m_errorState; } if (inCountLine == 1) { if ((m_posChar=inLine.indexOf(' ')) == -1) word2=inLine; else word2=inLine.left(m_posChar); if (word1 =="ENUM") { if (word2 != word) { m_errorState = UnknownFormat; return m_errorState; } varMax=0; inCountLine++; enumString = new QVector; enumString->clear(); } else { if (word1=="ERR") m_errorState=upsTranslateError(word2); // prevede chybu na jeji kod else m_errorState=UnknownAnswer; return m_errorState; } } else { if (word1 == "END") break; if (word1 != "OPTION") { m_errorState = UnknownFormat; return m_errorState; } if ((m_posChar = inLine.indexOf('\"')) == -1) word2 = ""; else { word2 = inLine.mid(m_posChar+1); if ((m_posChar=word2.indexOf('\"')) != -1) word2 = word2.left(m_posChar); } enumString->push_back(word2); varMax++; } } // end while } // buffer is not empty else { m_errorState = NoData ; return m_errorState; } } // getUpsData else return m_errorState; } // type of var else enumString = 0l; // nacteme stringovou promenou // ulozime promene setRWVars (word,valueType,varMax,enumString); m_numberRWVars++; break; } } // end while (!inputStream.atEnd()) } else { m_errorState = NoData ; return m_errorState; } } else return m_errorState; // *************** INSTANT COMMAND if (!m_upsName.isEmpty()) { // pokud upsName neni je vzdy nastaveno na null inBuffer="LISTINSTCMD " + m_upsName.toLocal8Bit() + "\n"; } else inBuffer ="LISTINSTCMD\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer)) == NoError) { outBuffer=outBuffer.trimmed(); if ( !outBuffer.isEmpty() ) { // precteme data QTextStream inputStream(&outBuffer); QString word; int count =1 ; while (!inputStream.atEnd()) { inputStream >> word; switch (count) { case 1: // vyndame prvni polozku if (word == "INSTCMDS") count++; else { if (word == "ERR") { inputStream >> word; m_errorState = upsTranslateError(word); } else m_errorState=UnknownAnswer; return m_errorState; } break; case 2: count++; if ((word.length() > 0) && word.startsWith("@")) break; default: // Zpracujeme polozku v tabulky upsIComm.upsCommName=word; upsIComm.upsDescription=""; m_listIComms.push_back(upsIComm); m_numberIComms++; break; } } } else { m_errorState=NoData; return m_errorState; } } else return m_errorState; return NoError; } KNutNet::NetError KNutNet::getUpsVars2 ( void) { QByteArray inBuffer; QString outBuffer; QString varOutBuffer; upsVarDef upsVar; upsICommDef upsIComm; int key; int typeValue; int lenString; int varMax=0; qDebug("KNutNet::getUpsVars2"); QVector* enumString=0; inBuffer = "LIST VAR " + m_upsName.toLocal8Bit() + "\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer,"END LIST VAR")) == NoError) { QString inLine, upsNameRet, varName, varNameRet, value; bool beginList = false; QTextStream varInputStream(&outBuffer); while (!(inLine = varInputStream.readLine()).isNull()) { key = parseLine (inLine, upsNameRet, varName, value, typeValue, lenString); switch (key) { case BEGIN_LIST_VAR: if (upsNameRet == m_upsName) beginList = true; break; case VAR: if (beginList ) { upsSetType(upsVar, varName, value); if (varName == "ups.status") genStatusFlags(value); inBuffer = "GET TYPE " + m_upsName.toLocal8Bit() + " " + varName.toLocal8Bit() +"\n"; if ((m_errorState=getUpsData (inBuffer,varOutBuffer)) == NoError) { key = parseLine (varOutBuffer, upsNameRet, varNameRet, value, typeValue, lenString); switch (key) { case TYPE: if (typeValue & RW_FLAG) { upsVar.upsVarMax = 0; upsVar.upsEnumValues=0L; if (typeValue & ENUM_FLAG) { upsVar.upsValueType=false; // nacteme enumValues inBuffer = "LIST ENUM " + m_upsName.toLocal8Bit() + " " + varName.toLocal8Bit() +"\n"; if ((m_errorState=getUpsData (inBuffer,varOutBuffer,"END LIST ENUM")) = NoError) { bool beginEnumList = false; QTextStream varInputStream(&varOutBuffer); while (!(inLine = varInputStream.readLine()).isNull()) { key = parseLine (inLine, upsNameRet, varName, value, typeValue, lenString); switch (key) { case BEGIN_LIST_ENUM: beginEnumList = true; varMax=0; enumString = new QVector; enumString->clear(); upsVar.upsEnumValues=enumString; break; case ENUM: if (beginList ) { enumString->push_back(value); varMax++; } break; case ERR: m_errorState = upsTranslateError(value); return m_errorState; default: m_errorState=UnknownAnswer; return m_errorState; case END_LIST_ENUM: upsVar.upsVarMax=varMax; break; } } } } else { // Vse co neni ENUM je STRING upsVar.upsValueType=true; upsVar.upsVarMax=lenString; } upsVar.upsVarType=false; m_numberRWVars++; } break; case ERR: m_errorState = upsTranslateError(value); return m_errorState; default: m_errorState=UnknownAnswer; return m_errorState; } } else { return m_errorState; } m_listVars.push_back(upsVar); m_numberVars++; } break; case END_LIST_VAR: break; case ERR: m_errorState = upsTranslateError(value); return m_errorState; default: m_errorState=UnknownAnswer; return m_errorState; } // end switch } // end while } else { return m_errorState; } // INSTANT COMMANDS inBuffer = "LIST CMD " + m_upsName.toLocal8Bit() + "\n"; if ((m_errorState=getUpsData (inBuffer,outBuffer,"END LIST CMD")) == NoError) { QString inLine, upsNameRet, varName, value; int key, typeValue; bool beginList = false; QTextStream varInputStream(&outBuffer); while (!(inLine = varInputStream.readLine()).isNull()) { key = parseLine (inLine, upsNameRet, varName, value, typeValue, lenString); switch (key) { case BEGIN_LIST_CMD: { if (upsNameRet == m_upsName) beginList = true; break; } case CMD: if (beginList ) { // Zpracujeme polozku v tabulky upsIComm.upsCommName=varName; upsIComm.upsDescription=""; m_listIComms.push_back(upsIComm); m_numberIComms++; } break; case END_LIST_CMD: break; case ERR: m_errorState = upsTranslateError(value); return m_errorState; default: m_errorState=UnknownAnswer; return m_errorState; } // end switch } // end while } else { return m_errorState; } return NoError; } KNutNet::NetError KNutNet::getUpsValues1 (const bool allVars ) {// allVars = true vse; allVars = false jen activate QString endChar; QByteArray inBuffer; QString outBuffer; QVector::iterator it; // Nacte hodnotu promenych // reads value of variables qDebug("KNutNet::getUpsValues1"); emit getVarDesc (m_numberVars, 0); int numberVar = 0; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { numberVar++; if ((allVars) || ((*it).upsVarActive)) { //nacteme promenou inBuffer = "REQ " + (*it).upsVarName.toLocal8Bit(); if (!m_upsName.isEmpty()) { // pokud upsName neni je vzdy nastaveno na null inBuffer.append("@"); inBuffer.append(m_upsName.toLocal8Bit()); } inBuffer.append("\n"); // if ((error=getUpsData (inBuffer,outBuffer)) == NoError) { m_errorState=getUpsData (inBuffer,outBuffer); // when outBuffer is empty sends and reads date again, but only the only time if ((m_errorState == NoError) && (outBuffer.isEmpty())) m_errorState=getUpsData (inBuffer,outBuffer); if (m_errorState == NoError) { endChar = ""; if ((outBuffer.length()>0) && (outBuffer.at(outBuffer.length()-2)==' ')) endChar=' '; outBuffer=outBuffer.trimmed(); outBuffer += endChar; emit getVarDesc (m_numberVars, numberVar); if ( !outBuffer.isEmpty() ) { QTextStream inputStream(&outBuffer); QString word1, word2, word3 ; inputStream >> word1; inputStream >> word2; if (inputStream.atEnd()) { // neexistuje treti cast VALUE if (word1 == "ERR") { // vracena chyba m_errorState=upsTranslateError(word2); return m_errorState; } else { // if ((word2 != "MODEL") && (word2 != "MFR")) { if (endChar != " ") { // if values of variable is empty, string is ended on char space m_errorState=UnknownFormat; return m_errorState; } } } inputStream >> word3; if (word1 == "ANS") { // answer - odpoved // odstranime pripadne jmeno upsky if ((m_posChar = word2.indexOf('@')) != -1) word2 = word2.left(m_posChar); if ( word2 != (*it).upsVarName ) { m_errorState=UnknownAnswer; return m_errorState;// neni to odpoved na spravnou promennou } // test pro starsi format modulu, vraceli chybu v hodnote promene if ((m_errorState=upsOldTranslateError(word3))) { return m_errorState; } // zalozime hodnotu do vectoru; (*it).upsValue=word3; if ((*it).upsVarName == "STATUS") { // dogenerujeme dalsi slova pro status word3 += inputStream.readLine(); genStatusFlags(word3); } } else { // neznama odpoved - neni ANS ani ERR m_errorState=UnknownAnswer; return m_errorState; } } else { m_errorState=NoData; return m_errorState; } } else { return m_errorState; } } } return NoError; } KNutNet::NetError KNutNet::getUpsValues2 (const bool allVars ) {// allVars = true vse; allVars = false jen activate QString varName; QString upsNameRet; QString value; int typeValue; int lenString; // reads value of variables QByteArray inBuffer; QString outBuffer; QVector::iterator it; qDebug ("KNutNet::getUpsValues2"); emit getVarDesc (m_numberVars, 0); int numberVar = 0; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { numberVar++; if ((allVars) || ((*it).upsVarActive)) { //reads variable inBuffer = "GET VAR "+m_upsName.toLocal8Bit()+" "+(*it).upsVarName.toLocal8Bit() + "\n"; m_errorState=getUpsData (inBuffer,outBuffer); // when outBuffer is empty sends and reads date again, but only the only time if ((m_errorState == NoError) && (outBuffer.isEmpty())) m_errorState=getUpsData (inBuffer,outBuffer); if (m_errorState == NoError) { outBuffer=outBuffer.trimmed(); emit getVarDesc (m_numberVars, numberVar); if ( !outBuffer.isEmpty() ) { int key = parseLine(outBuffer, upsNameRet, varName, value, typeValue, lenString); switch (key) { case VAR: if ( varName != (*it).upsVarName ) { m_errorState=UnknownAnswer; return m_errorState;// it isn't answer for right variable - neni to odpoved na spravnou promennou } (*it).upsValue=value; if ((((*it).upsVarName == "STATUS") && (m_nutVariables == versionVarOne)) || (((*it).upsVarName == "ups.status") && (m_nutVariables == versionVarTwo))) { // dogenerujeme dalsi slova pro status genStatusFlags(value); } break; case ERR: m_errorState=upsTranslateError(value); return m_errorState; default: m_errorState=UnknownAnswer; return m_errorState; } } else { m_errorState= NoData; return m_errorState; } } else { return m_errorState; } } } return NoError; } KNutNet::NetError KNutNet::sendComm (const QString command, const QString arg1, const QString arg2, const bool useUpsName) { NetError localError; // nenastavi promenou error ale nenuluje ji QByteArray inBuffer; QString outBuffer; switch (m_nutProtocol) { case 1: inBuffer=command.toLocal8Bit() + " " + arg1.toLocal8Bit(); if (useUpsName && (!m_upsName.isEmpty())) // pokud upsName neni je vzdy prazdne inBuffer += "@"+m_upsName.toLocal8Bit(); if (!arg2.isEmpty()) inBuffer += " " + arg2.toLocal8Bit(); break; case 2: inBuffer = command.toLocal8Bit() + " "; if (useUpsName) inBuffer += m_upsName.toLocal8Bit() + " "; inBuffer.append(arg1.toLocal8Bit()); if (!arg2.isEmpty()) inBuffer += " \"" + arg2.toLocal8Bit() +"\""; break; } inBuffer.append("\n"); if ((localError=getUpsData (inBuffer,outBuffer)) == NoError) { outBuffer=outBuffer.trimmed(); QTextStream inputStream(&outBuffer); QString word1, word2; inputStream >> word1; inputStream >> word2; if (word1.isEmpty()) return UnknownAnswer; // zadna odpoved if (word1 != "OK") { // neni rovno OK if (word1 == "ERR") return upsTranslateError (word2); else return UnknownAnswer; } else return NoError; } else return localError; } int KNutNet::setActiveUpsVar ( const QString name, const bool active ) { m_errorState =NoError; if (m_state == Connected) { QVector::iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { if ((*it).upsVarName == name) { (*it).upsVarActive = active; return 0; } } m_errorState = VarNotFind; return m_errorState; } else return NotConnection; } int KNutNet::setActiveAllUpsVars ( const bool active ) { m_errorState =NoError; if (m_state == Connected) { QVector::iterator it; for (it = m_listVars.begin(); it != m_listVars.end(); it++) { (*it).upsVarActive = active; } return 0; } else return NotConnection; } KNutNet::NetError KNutNet::upsTranslateError (const QString string) { if (string == "VAR-NOT-SUPPORTED") return VarNotSupported; if (string == "VAR-UNKNOWN") return VarUnknown; if (string == "ACCESS-DENIED") return AccessDenied; if (string == "PASSWORD-REQUIRED") return PasswordRequired; if (string == "PASSWORD-INCORRECT") return PasswordIncorrect; if (string == "UNKNOWN-UPS") return UnknownUps; if (string == "ALREADY-LOGGED_IN") return AlreadyLoggedIn; if (string == "ALREADY-SET-PASSWORD") return AlreadySetPassword; if (string == "ALREADY-SET-USERNAME") return AlreadySetUsername; if (string == "UNKNOWN-COMMAND") return UnknownCommand; if (string == "UNKNOWN-INSTCMD") return UnknownInstCmd; if (string == "CMD-NOT-SUPPORTED") return CmdNotSupported; if (string == "INVALID-VALUE") return InvalidValue; if (string == "NO-RESPONSE") return NoResponse; if (string == "UNKNOWN-REPLY") return UnknownReply; if (string == "NOT-IMPLEMENTED") return NotImplemented; if (string == "COMMAND-FAILED") return CommandFailed; if (string == "MISSING-ARGUMENT") return MissingArgument; if (string == "DATA-STALE") return DataStale; if (string == "UNKNOWN-TYPE") return UnknownType; if (string == "DRIVER-NOT-CONNECTED") return DriverNotConnected; if (string == "") return UnknownFormat; return UnknownErr; } KNutNet::NetError KNutNet::upsOldTranslateError (const QString string) { if (string == "NOT-SUPPORTED") return VarNotSupported; if (string == "UNKNOWN") return VarUnknown; if (string == "DATA-STALE") return DataStale; return NoError; // nebylo nalezeno } //--------------------Socket---------------- void KNutNet::slotConnectionError(QAbstractSocket::SocketError socketError) { qDebug ("KNutNet::slotConnectionError"); m_unConnectTimer->stop(); if (socketError == QAbstractSocket::HostNotFoundError) { m_errorState = NoSuchHost; emit connectionError(m_errorState); return; } //connection was refused // no connection if ((socketError == QAbstractSocket::ConnectionRefusedError) && (m_commandSocket->state()==QAbstractSocket::UnconnectedState)) { if (m_firstConnect) { if (m_numberConnection < m_countRepeat) { m_numberConnection++; m_unConnectTimer->setSingleShot( TRUE ); m_unConnectTimer->start( m_delay ); } else { // i don't connect server m_errorState=CantConnect; emit connectionError(m_errorState); return; } } // end of if (firstConnection) else { // connecting is down, try repeated connection m_unConnectTimer->setSingleShot (TRUE); m_unConnectTimer->start( m_delay); } return; } if (socketError == QAbstractSocket::NetworkError) { m_errorState = NetworkError; emit connectionError(m_errorState); return; } if (socketError == QAbstractSocket::SocketAccessError) { m_errorState = SocketAccessError; emit connectionError(m_errorState); return; } if (socketError == QAbstractSocket::SocketResourceError) { //qDebug ("KNutNet::slotConnectionError SocketResourceError"); m_errorState = SocketResourceError; emit connectionError(m_errorState); return; } if (socketError == QAbstractSocket::SocketTimeoutError) { //qDebug ("KNutNet::slotConnectionError SocketTimeoutError"); m_errorState = SocketTimeout; // emit connectionError(error); return; } if (socketError == QAbstractSocket::RemoteHostClosedError) { //qDebug ("KNutNet::slotConnectionError RemoteHostClosedError"); m_errorState = ConnetionClosedByServer; //slotDisconnectes is called auto by signal disconnected emit connectionClosedByServer(); return; } if (socketError == QAbstractSocket::UnknownSocketError) { //qDebug ("KNutNet::slotConnectionError UnknownSocketError"); m_errorState = UnknownSocketError; emit connectionError(m_errorState); return; } } void KNutNet::slotConnected(void) { qDebug ("KNutNet::slotConnected"); int n; if ((n = version (m_countRepeat, m_delay)) == 0) { // 0 OK, 0> error if ((m_nutProtocol == 0) || (m_nutVariables == versionVarUnknown)) { // answer from upsd (VER) is unknown m_errorState=NutProtocolVarErr; m_state = Closing; m_commandSocket->close(); while (m_commandSocket->state() == QAbstractSocket::ClosingState) { KNutSleep::msleep(100); } return; } if ((m_nutProtocol == 2) && m_upsName.isEmpty()) { // if upsName is empty reads first ups name from upsd server if ((m_errorState =KNutNet::getFirstUpsName (m_upsName)) != NoError) { // reading first upsName // upsd server doesn't support any ups m_state = Closing; m_commandSocket->close(); while (m_commandSocket->state() == QAbstractSocket::ClosingState) { KNutSleep::msleep(100); } return; } } m_state=Connected; } else { m_state = Closing; m_commandSocket->close(); } emit firstConnection(); } void KNutNet::slotHostFound(void) { qDebug("KNutNet::slotHostFound"); m_state = Connecting; emit hostFound(); } void KNutNet::slotTimerReconnect(void) { qDebug("KNutNet::slotTimerReconnect"); m_unConnectTimer->stop(); if (m_commandSocket->state()==QAbstractSocket::UnconnectedState) { emit tryRepeatFirstConnection(m_numberConnection); // m_state=Connecting; if ( m_commandSocket->state() != QAbstractSocket::ConnectingState ) m_state = HostLookup; m_commandSocket->connectToHost(m_upsAddress,m_port); } } #include "knutnet.moc" knc105/src/knutfrontpanel.h0000644000175000017500000001744411436653645014206 0ustar dandan/*************************************************************************** knutfrontpanel.h - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTFRONTPANEL_H #define KNUTFRONTPANEL_H #include #include /** *@author Daniel Prynych */ class QFont; class QPalette; class QColor; class QLCDNumber; class QLabel; class QVBoxLayout; class QHBoxLayout; class QGroupBox; /** * Class is used for feature of panel, which shows informations about UPS. * Trida slouzi pro zobrazeni panelu, ktery zobrazuje informace o UPS. * * * @author Daniel Prynych * @short Main panel * @version 0.8.0 */ class KNutFrontPanel : public QFrame { Q_OBJECT public: enum KNFPConst { DefaultPanelFlags = 1615}; //1+2+4+8+64+512+1024 enum panelBulb { PBOnLine = 1, // Panel Bulb On Line PBOnBatt = 2, // Panel Bulb On Battery PBOver = 4, // Panel Bulb Overloading PBBattLow = 8, // Panel Bulb Battery Low PBRepBatt = 16, // Panel Bulb Replace Battery PBCal = 32, // Panel Bulb Calibration PBMFRMod = 64, // FRM + Model PBMFR = 128, // FRM PBModel = 256, // Model PBSerial = 512, // Serial PBFirm = 1024, // Firmware Revision PBRun=2048 // Panel LCD Number Runtime }; /** * Constructor - makes panel, which shows status of UPS * Konstruktor - vytvori panel, ktery zobrazuje stav UPS-ky. * * @param flags Determine which parts will be shown. * @param panelFonts Pointer to font, which is used for painnting, when one is 0 (zero) systems font is used. * @param flags Udava ktere casti se maji na panelu zobrazit. * @param panelFonts Odkaz na fonts ktery se ma pouzit pro vykreslovani, pokud je = 0 (nula) pouzije se systemovy font pri aplikaci. * @since 0.9 */ KNutFrontPanel( const QPalette palette, const QFont panelFonts, QWidget *parent = 0, const unsigned int flags = DefaultPanelFlags); /** * Destruktor * * @since 0.3 */ ~KNutFrontPanel(); /** * Vykresli na panelu udaje. * Paints values on panel. * * @since 0.4 */ void paintPanel( void); /** * Vrati nastaveni panelu. * Gets setting of panel (flags of panel). * * @since 0.2 */ unsigned int getPanelFlags( void); /** * Nastavi priznaky(nastaveni) panelu. Tyto priznaky nastavuji ktere prvky budou na panelu zobrazeny. * Sets flags of panel. This flags sets what items will be showed on panel. * * @param upsPanelFlags flags od panel. * @param upsPanelFlags priznaky panelu. * * @since 0.2 */ void setPanelFlags(const int upsPanelFlags); /** * Shows complete name (name of UPS and manufacturer) of UPS on panel. * Zobrazi na panelu cele jmeno (jmeno UPS a vyrobce ) UPS-ky. * * @param upsPanelName Text which is showed on panel (address of UPS and manufacturer). * @param upsPanelName Text ktery se zobrazi na panelu (adresa UPS-ky a vyrobce). * * @since 0.2 */ void setAllNameUps(const QString panelUpsAllName); /** * Shows name of UPS on panel. * Zobrazi na panelu jmeno UPS-ky. * * @param upsPanelName Text which is shown on panel (name of UPS). * @param upsPanelName Text ktery se zobrazi na panelu (jmeno UPS-ky). * * @since 0.3 */ void setNameUps(const QString panelUpsName ); /** * Zobrazi na panelu jmeno vyrobce UPS-ky. * Shows name of UPS's manufacturer on panel. * * @param panelUpsFRM Text ktery se zobrazi na panelu (vyrobce UPS). * @param panelUpsFRM Text which is showed on panel (UPS's manufacturer). * * @since 0.2 */ void setMFRUps(const QString panelUpsFRM ); /** * Shows serial number of UPS on panel. * Zobrazi na panelu seriove cislo UPS-ky. * * @param panelUpsSerial Text ktery se zobrazi na panelu (seriove cislo UPS-ky). * @param panelUpsSerial Text which is showed on panel (serial number of UPS). * * @since 0.2 */ void setSerialUps(const QString panelUpsSerial ); /** * Zobrazi na panelu verzi firmwaru cislo UPS-ky. * * @param upsPanelFormRev Text ktery se zobrazi na panelu (verze firmwaru UPS-ky). * * @since 0.2 */ void setFirmRevUps(const QString upsPanelFormRev ); /** * Offs bulbs on panel. / Cleans panel. * Zhasne indikacni prvky na panelu. * * @since 0.5 */ void cleanPanel(void); /** * Shows bulbs on panel. * Rozsviti indikacni prvky na panelu. * * @param panelBulbs Code for select lighted bulbs. * @param panelBulbs Kod pro urceni rozsvicenych indikacnich prvku. * * @since 0.4 */ void setPanel(const int panelBulbs); /** * Sets value of runtime. * Nastavi hodnotu runtime. * * @param Runtime hodnota ktera se zobrazi jako runtime. * * @since 0.4 */ void setRuntime(const int runtime); /** * Sets palette. * Nastavi paletu (palette). Predefinovana funkce from QWidget. * * @param Palette which mail panel is painted. * @param Paleta kterou ma byt vykreslen hlavni panel * * @since 0.1 */ void setPalette (const QPalette & ); public slots: /** * Changes font for painting. * Zmeni font pro vykresleni. * * @param panelFonts Novy font. * * @since 0.2 */ void slotSetPanelFont(QFont newPanelFont); private: /** * @internal * Sets palettes for LCDLabel. * Nastavi palety pro LCDLabel. * * @since 0.1 */ void setLCDPalette (void); /** * @internal * Makes change of palette of all items on based values m_palette * Provede zmenu palety vsech prvku na zaklade promenne m_palette * * @since 0.1 */ void setAllPalettes (void); /** * @internal * Makes font's change of all items, based on values m_panelFont and m_panelBoldFont * Provede zmenu fontu vsech prvku, na zaklade promennych m_panelFont and mpanelBoldFont * * @since 0.1 */ void changePanelFont (void); unsigned int m_panelFlags; // selects which of rows will be shown/ urcuji ktera radka bude rozsvicena 1 OL, 2 OB, 3 OVER, 4 RB, CAL 5 ... QPalette m_palette; QLabel* m_textLabel1; QLabel* m_textLabel2; QLabel* m_textLabel3; QLabel* m_textLabel4; QLabel* m_textLabel5; QLabel* m_textLabel6; QLabel* m_textLabel7; QLabel* m_textLabel8; QLabel* m_textLabel9; QLabel* m_textLabel10; QLabel* m_textLabel11; QLabel* m_textLabelManufac; QLabel* m_textLabelName; QLabel* m_textLabelSerial; QLabel* m_textLabelFirm; QLabel* m_textLabelRun; KLed* m_frameOL; KLed* m_frameOB; KLed* m_frameOVER; KLed* m_frameLB; KLed* m_frameRB; KLed* m_frameCAL; QLCDNumber* m_LCDNumber1; QPalette m_LCDPaletteOk; QPalette m_LCDPaletteErr; QPalette m_bulbsPalette; QColor m_upsOkColor; QColor m_upsErrorColor; QColor m_upsBackColor; QColor m_helpColor; QFont m_panelFont; // font pro header QFont m_panelBoldFont; // font for date QGroupBox* m_bulbsGroupBox; QGroupBox* m_messGroupBox; QGroupBox* m_valGroupBox; bool m_typeOfLCDColor; QVBoxLayout* m_mainLayout; QHBoxLayout* m_OLayout; QHBoxLayout* m_LBLayout; QHBoxLayout* m_RBLayout; QHBoxLayout* m_CALLayout; QHBoxLayout* m_manufacModelLayout; QHBoxLayout* m_manufacLayout; QHBoxLayout* m_nameLayout; QHBoxLayout* m_serialLayout; QHBoxLayout* m_firmLayout; QHBoxLayout* m_runLayout; }; #endif knc105/src/knutinstcomms.cpp0000644000175000017500000001040711436653645014375 0ustar dandan/*************************************************************************** knutinstcomms.cpp - description ------------------- begin : ct rj 24 2002 copyright : (C) 2002 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutinstcomms.h" #include "knutprintupsvar.h" #include "knutvardata.h" #include #include #include #include KNutInstComms::KNutInstComms(QString* oldUserName, QString* oldPassword, const QString uName, const QString password, KNutNet* const upsNet, QWidget* parent) : KDialog( parent ), m_upsNet(upsNet), m_oldUserName(oldUserName), m_oldPassword(oldPassword) { upsICommDef upsIComm; if (!m_upsNet) return; setCaption( i18n("Instant commands") ); setButtons( KDialog::Ok | KDialog::Cancel ); m_upsConnectOk=true; QWidget *mainWidget = new QWidget (this); setMainWidget( mainWidget); QVBoxLayout *topLayout = new QVBoxLayout( mainWidget ); QLabel *label1 = new QLabel (i18n("RUN INSTANT COMMAND"),mainWidget); label1->setAlignment(Qt::AlignHCenter); topLayout->addWidget(label1); QLabel *label2 = new QLabel (i18n("Command:"),mainWidget); m_instCommBox = new KComboBox(mainWidget); QGridLayout *passLayout = new QGridLayout (); QLabel *labelName = new QLabel (i18n("User name:"),mainWidget); QLabel *labelPassword = new QLabel (i18n("Password:"),mainWidget); m_lineEditName = new KLineEdit( mainWidget ); m_lineEditPassword = new KLineEdit( mainWidget ); if (((*m_oldUserName) == "") && ((*m_oldPassword) == "")) { m_lineEditName->setText(uName); m_lineEditPassword->setText(password); } else { m_lineEditName->setText(*m_oldUserName); m_lineEditPassword->setText(*m_oldPassword); m_lineEditName->setDisabled(true); m_lineEditPassword->setDisabled(true); } m_lineEditPassword->setEchoMode(QLineEdit::Password); topLayout->addLayout(passLayout); passLayout->addWidget(label2,0,0); passLayout->addWidget(m_instCommBox,0,1); passLayout->addWidget(labelName,1,0); passLayout->addWidget(labelPassword,2,0); passLayout->addWidget(m_lineEditName,1,1); passLayout->addWidget(m_lineEditPassword,2,1); topLayout->addStretch(10); //loads ComboBox int n = m_upsNet->readNumberComms(); for (int i =0; i < n ; i++) { if (!m_upsNet->readIComm(i+1, upsIComm)) m_instCommBox->addItem(upsIComm.upsCommName); } connect( this, SIGNAL( okClicked() ), this, SLOT( slotOk() ) ); } KNutInstComms::~KNutInstComms(){ } void KNutInstComms::slotOk() { int error =0; if (((*m_oldUserName) == "") && ((*m_oldPassword) == "")) { // prvni propojeni nastavime jmeno a heslo //for the first connection we have to set name and password if (!( error = m_upsNet->instantCommand(m_instCommBox->currentText(),m_lineEditName->text(),m_lineEditPassword->text(),false))) { (*m_oldUserName) = m_lineEditName->text(); (*m_oldPassword) = m_lineEditPassword->text(); accept(); return; } } else { // for other connection name and password are not setted if (((*m_oldUserName) == m_lineEditName->text()) && ((*m_oldPassword) == m_lineEditPassword->text())) { // jen posleme prikaz // sends command only if (!( error = m_upsNet->instantCommand(m_instCommBox->currentText(),m_lineEditName->text(),m_lineEditPassword->text(),true))) { accept(); return; } } } emit signalShowMessage(KNutVarData::errorToText (error),"icerrors_event"); } #include "knutinstcomms.moc" knc105/src/knutupsdata.h0000644000175000017500000000772111436653645013474 0ustar dandan/*************************************************************************** knutupsdata.h - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTUPSDATA_H #define KNUTUPSDATA_H #include "knutconst.h" //#include #include class QString; /** *@author Daniel Prynych */ /** * Trida obsahuje data o UPS-kach, * nazev, adresu port, protokol, promenne atd. * Class includes data about UPSes like name. address, port, protocol, variables ... * * @author Daniel Prynych * @short Information about UPS * @version 0.5 **/ class KNutUpsData { public: struct upsRecordDef { //include information about one UPS QString name; // name QString upsName; // name of UPSky <> mojeups QString upsAddress; // address of UPS <> muj.pc.cz int delay; // time between read date from UPS //unsigned short port; // port for connecting server quint16 port; // port for connecting server //unsigned 16 bit integer number always QString userName; QString password; bool savePassword; //save password into configuration int upsVarCode[knc::NumberOfVars]; //list of analogs }; /** * Konstruktor * * @since 0.3 **/ KNutUpsData(); /** * Destruktor * * @since 0.3 **/ ~KNutUpsData(); /** * Adds record * Prida zaznam. * * @param upsRecord are data of record in structure of upsRecordStruct. * @param upsRecord jsou data zaznamu ve strukture upsRecordStruct. * @since 0.4 **/ void add (const upsRecordDef upsRecord); /** * Rewrites record * Prepise zaznam. * * @param index Describes order number od record. * @param index Udava poradove cislo zaznamu.. * @param upsRecord are data of record in structure of upsRecordStruct. * @param upsRecord jsou data zaznamu ve strukture upsRecordStruct. * @since 0.4 **/ void put (const int index, const upsRecordDef upsRecord ); /** * Returns record. * Vrati zaznam. * * @param index Describes order number od record. * @param index Udava poradove cislo zaznamu. * @param upsRecord are data of record in structure upsRecordStruct. * @param upsRecord jsou data zaznamu ve strukture upsRecordStruct. * * @since 0.4 **/ void get (const int index, upsRecordDef& upsRecord ); /** * Returns name of record. * Vrati jmeno zaznamu. * * @param index Describes order number od record. * @param index Udava poradove cislo zaznamu. * @since 0.3 **/ QString getName (const int index); /** * Deletes record; * Zrusi zaznam. * * @param index Describes order number od record. * @param index Udava poradove cislo zaznamu. * * @since 0.3 **/ void deleteName (const int index); /** * Returns count of records * Vrati pocet zaznamu. * * @since 0.3 **/ int getCount ( void ); /** * Returns pointer on record, when record is not existed returns 0 * Vrati ukazatel na zaznam, pokud zaznam neexistuje vrati 0. * * @param name Is name of list. * @param name Je jmeno zaznamu. * @since 0.3 **/ upsRecordDef* findName (const QString name); private: int m_countUpsRecords; QList m_listRecords; }; #endif knc105/src/knutprintupsvar.cpp0000644000175000017500000002055011436653645014756 0ustar dandan/*************************************************************************** knutprintupsvar.cpp - description ------------------- begin : St cec 3 2002 copyright : (C) 2002 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutprintupsvar.h" #include "knutvardata.h" #include #include #include #include //#include // od verze 0.6.0 nebudeme vytvaret vlastni spojeni KNutPrintUpsVar::KNutPrintUpsVar(KNutNet* const upsNet, const bool useDescription, const bool allowNotification, QWidget* parent) : KDialog(parent), m_upsNet(upsNet), m_allowNotification(allowNotification) { if (!upsNet) return; upsVarDef upsVar; upsICommDef upsIComm; dataVarDef dataVar; m_dataVarList.clear(); setCaption( i18n("UPS variables") ); setButtons( KDialog::User1 | KDialog::Cancel ); setButtonText(KDialog::User1,i18n("Reload Vars")); m_treeWidget = new QTreeWidget(this); //mainWidget setMainWidget( m_treeWidget ); QStringList headersList; headersList << i18n("Name") << i18n("Value"); if (useDescription) { m_treeWidget->setColumnCount(3); headersList << i18n("Description"); } else { m_treeWidget->setColumnCount(2); } m_treeWidget->setHeaderLabels (headersList); int countVars=m_upsNet->readNumberVars(KNutNet::AllVars); int countRWVars=m_upsNet->readNumberVars(KNutNet::RWVars); int countIComms=m_upsNet->readNumberComms(); m_iconDir = KIcon("folder-open"); m_treeWidget->setRootIsDecorated(true); m_treeWidget->setAllColumnsShowFocus( true ); m_treeWidget->setUniformRowHeights(true); m_treeWidget->setSortingEnabled(false); m_treeWidget->setIndentation(20); QTreeWidgetItem* widgetItem; if (countIComms) { QTreeWidgetItem* ICommMainWidget = new QTreeWidgetItem( m_treeWidget); ICommMainWidget->setText (0,i18n("Instant Commands")); ICommMainWidget->setIcon(0,m_iconDir); m_treeWidget->expandItem(ICommMainWidget); for (int i=0; ireadIComm(i+1,upsIComm); widgetItem = addTreeWIdgetItem (ICommMainWidget, upsIComm.upsCommName, ""); if ((!upsVar.upsDescription.isEmpty()) && useDescription) { widgetItem ->setText (2,upsIComm.upsDescription); } } } if (countRWVars) { QTreeWidgetItem* RWVarsMainWidget = new QTreeWidgetItem( m_treeWidget); RWVarsMainWidget->setText (0,i18n("Read/Write Variables")); RWVarsMainWidget->setIcon(0,m_iconDir); m_treeWidget->expandItem(RWVarsMainWidget); for (int i=0; ireadVars(i+1,upsVar); if (!upsVar.upsVarType) { dataVar.name=upsVar.upsVarName; widgetItem = addTreeWIdgetItem ( RWVarsMainWidget, upsVar.upsVarName, upsVar.upsValue); dataVar.value = widgetItem; if ((!upsVar.upsDescription.isEmpty()) && useDescription) widgetItem->setText(2,upsVar.upsDescription); m_dataVarList.push_back(dataVar); } } } QTreeWidgetItem* ROVarsMainWidget = new QTreeWidgetItem( m_treeWidget); ROVarsMainWidget->setText(0,i18n("Read Only Variables")); ROVarsMainWidget->setIcon(0,m_iconDir); m_treeWidget->expandItem(ROVarsMainWidget); for (int i=0; ireadVars(i+1,upsVar); if (upsVar.upsVarType) { dataVar.name=upsVar.upsVarName; widgetItem = addTreeWIdgetItem( ROVarsMainWidget, upsVar.upsVarName, upsVar.upsValue); dataVar.value = widgetItem; if ((!upsVar.upsDescription.isEmpty()) && useDescription) widgetItem->setText(2,upsVar.upsDescription); m_dataVarList.push_back(dataVar); } } m_treeWidget->resizeColumnToContents ( 0 ); m_treeWidget->resizeColumnToContents ( 1 ); colorRow(); connect (this,SIGNAL(user1Clicked()),this,SLOT(slotReloadVars())); connect (m_treeWidget,SIGNAL(itemCollapsed ( QTreeWidgetItem*)),this,SLOT(slotTreeCollapsedExpanded (QTreeWidgetItem *))); connect (m_treeWidget,SIGNAL(itemExpanded ( QTreeWidgetItem*)),this,SLOT(slotTreeCollapsedExpanded (QTreeWidgetItem *))); } KNutPrintUpsVar::~KNutPrintUpsVar(){ m_dataVarList.clear(); if (m_treeWidget) delete m_treeWidget; } void KNutPrintUpsVar::colorRow (void) { bool rowBackground = true; //void QTreeWidgetItem::setBackground ( int column, const QBrush & brush ); for (int i=0; i < m_treeWidget->topLevelItemCount(); i++) { if (rowBackground){ for (int j=0; j < m_treeWidget->columnCount (); j++) { m_treeWidget->topLevelItem(i)->setBackground (j,palette().base()); } } else { for (int j=0; j < m_treeWidget->columnCount (); j++) { m_treeWidget->topLevelItem(i)->setBackground (j,palette().alternateBase()); } } rowBackground = !(rowBackground); if (m_treeWidget->topLevelItem(i)->isExpanded ()) { colorRowChildren (m_treeWidget->topLevelItem(i), rowBackground); } } } void KNutPrintUpsVar::colorRowChildren (const QTreeWidgetItem *item, bool &rowBackground ) { int count = item->childCount(); for (int i = 0; i < count; i++) { if (!(item->child(i)->isHidden())) { if (rowBackground) { for (int j=0; j < m_treeWidget->columnCount (); j++) { item->child(i)->setBackground (j,palette().base()); } } else { for (int j=0; j < m_treeWidget->columnCount (); j++) { item->child(i)->setBackground (j,palette().alternateBase() ); } } rowBackground = !(rowBackground); } if (item->child(i)->isExpanded ()) { colorRowChildren (item->child(i),rowBackground); } } } void KNutPrintUpsVar::slotReloadVars (void) { upsVarDef upsVar; if (m_upsNet->getUpsValues(true) !=0) { if (m_allowNotification) KNotification::event ("errorShowVars_event",KNutVarData::errorToText(m_upsNet->getError()).toLocal8Bit()); } else { QVector::const_iterator it; for (it = m_dataVarList.begin(); it != m_dataVarList.end(); it++) { m_upsNet->readVars((*it).name, upsVar); (*it).value->setText (1, upsVar.upsValue); } } } QTreeWidgetItem* KNutPrintUpsVar::addTreeWIdgetItem ( QTreeWidgetItem *rootWidget, QString varName, QString value) { QTreeWidgetItem* widgetItem; QTreeWidgetItem* helpWidgetItem; QString left; int n; widgetItem = rootWidget; do { n = varName.indexOf("."); if (n > 0) { left = varName.left(n); varName = varName.mid(n+1); if (!(helpWidgetItem = existTreeWidgetItem( widgetItem,left))) { widgetItem = new QTreeWidgetItem( widgetItem); widgetItem->setText(0,left); m_treeWidget->expandItem(widgetItem); } else widgetItem = helpWidgetItem; widgetItem->setIcon(0,m_iconDir); } else { // end part helpWidgetItem = new QTreeWidgetItem( widgetItem); helpWidgetItem->setText(0, varName); helpWidgetItem->setText(1, value); m_treeWidget->expandItem(helpWidgetItem); return helpWidgetItem; } } while (n > -1); return NULL; // for compiler only } QTreeWidgetItem* KNutPrintUpsVar::existTreeWidgetItem (const QTreeWidgetItem* widgetItem, const QString name) { int itemCount = widgetItem->childCount(); if ( itemCount == 0 ) return NULL; for (int i = 0; i < itemCount; i++) { if (widgetItem->child(i)->text(0) == name) return widgetItem->child(i); } return NULL; } void KNutPrintUpsVar::slotTreeCollapsedExpanded (QTreeWidgetItem *) { colorRow(); } #include "knutprintupsvar.moc" knc105/src/knutnet.h0000644000175000017500000005775611436653645012636 0ustar dandan/*************************************************************************** knutnet.h - description ------------------- begin : Ne led 12 2003 copyright : (C) 2003 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTNET_H #define KNUTNET_H #include #include #include #include #include #include class QTcpSocket; class QString; class QTimer; struct upsVarDef { QString upsVarName; bool upsVarActive; // value is active, getUpsValue reads its value bool upsVarType; // typ true(1) RO - false (0) RW (muzeme menit) bool upsValueType; // typ true(1) char - false (0) enum (vyctova) // ma vyznam jen pro RW promenne int upsVarMax; // udave max delku string promenne nebo pocet moznosti pro enum promennou // ma vyznam jen pro RW promenne QString upsValue; // hodnota promene QString upsDescription; // informace o promene QVector* upsEnumValues; }; struct upsICommDef { QString upsCommName; QString upsDescription; }; /** *@author Daniel Prynych */ /** * This class reads data from serveru NUT. * Since version 0.5 is written and API is changet. * Since 0.6.1 supports protocol client-server and variables for upsd >= nut 1.3 * Since 0.6.1 doesn't ups name like ups_name@host_address * Since 0.7 doesn't support UDP * Since 0.8 support KDE4 only not KDE3 * Tato trida zajistuje cteni dat ze serveru NUT. * Od verze 0.5 je uplne prepsana a je zmeneno i API. * Od verze 0.6.1 proporuje take client-server protokol a promenne pro upsd >= nut 1.3 * Od verze 0.6.1 nepodporuje jmeno ups ve tvaru jmeno_ups@adresa_pc * Od verze 0.7 neni podporovano UDP * Od verze 0.8 podporuje jen KDE4 ne KDE3 * * @author Daniel Prynych * @short Communication with UPS - Komunikace s UPS * @version 0.8 */ class KNutNet : public QObject { Q_OBJECT public: enum NetState {Idle, UnConnected = Idle, HostLookup, Connecting, Connected, Closing }; // enum NetState {Idle, UnConnected = Idle, HostLookup, Connecting, Connected, ConnectError,Closing }; // idle is same like UnConnected // neni pripojeno, vyhledani prijemce, pripojuji, pripojeno, pripojuji enum nutVarVersion {versionVarUnknown = 0, versionVarOne = 1 ,versionVarTwo = 2}; enum typeOfVar {AllVars, ROVars, RWVars }; enum NetError { NoError, LowMem, // no memmory - nebyla pridelena pamet NullAddress, // no address of host nebyla zadana adresa pocitace NoSuchHost, // this host noexist neexistuje takovy pocitac CantConnect, // I cannot connect to server Nemohu se spojit se serverem SocketReadErr, // I cannot read data from socket - Nelze cist data ze soketu UnknownSocketError = SocketReadErr, SocketTimeout = SocketReadErr, SocketResourceError = SocketReadErr, // too many sockets SocketAccessError = SocketReadErr, //application lacked the required privileges ConnectErr, // connect cannot is made - Nejde provest connect NutProtocolVarErr, // Nelze zjistit verze protokolu NoUpsHere, // ni UPS on this address na teto adrese neni zadna UPS ConnectionRefused, // server refused connection ConnetionClosedByServer, // connection was closed by server upsd // by the second side NetworkError, SendErr, // doesn't send date - Nelze odeslat data RecvErr, // doesn't receive data - Nelze prijmout data NoData, // no data was received, empty string was received - Nebyla prijmuta zadna data, byl prijmut prazdny retezec UnknownAnswer, // Server answer no right - Server neodpovedel spravne UnknownFormat, // Data hasn't got right structure - Data nemaji spravnou strukturu UnknownFormatVer, //Data returned after command VER don't have right structure - Data vracena po prikazu VER nemaji spravnou strukturu NoServerData, // doesn't read data from server (Server isn't answering) Nelze precist data ze serveru (Sever neodpovida) NoUpsnetOk, // UpsNetOK is setting on faLse - je nastaven UpsNetOk na false UnknownErr, // unknown error unknown text after ERR - neznama chyba - neznamy text za ERR CommNotFind, // command hasn't been found in list of module's commands - prikaz nebyl nalezen v seznamu prikazu modulu VarNotFind, // variable hasn't been found in list of module's variables promena nebyla nalezena v seznamu promenych modulu EnumValueNotFind, //value of enumereted variable hasn't been found hodnota vyctove promene nebyla nalezena // tyto zpravy vraci server // this mesages is returned server upsd AccessDenied, // access denied - pristup odmitnut PasswordRequired, // password is required - pro akci je nutno zaslat heslo PasswordIncorrect, // password is incorrect nespravane heslo UnknownUps, // this ups isn't occured on address - tato ups neni na zadane adrese AlreadyLoggedIn, // prihlaseni LOGIN jiz bylo provedeno AlreadySetPassword, // password has been already entered - heslo jiz bylo zadano AlreadySetUsername, // username has been already entered - uzivatelske jmeno jiz bylo zadano DataStale, // data from module isn't got - neni mozne ziskat z modulu nove data MissingArgument, // misses argument - chyby argument UnknownType, // unknown type of variable -neznamy typ promene UnknownCommand, // umknown command example: sends maybe "UPERNAME admin" - nezmamy prikaz pr: poslem treba "UPERNAME admin" //tyto chyby se vztahuji k driveru pro danny typ UPS-ky // this mistake is refered for selected driver of UPS DriverNotConnected, // driver isn't connected - driver neni pripojen NoResponse, // driver pro ups neodpovedel ve vymezenem case UnknownReply, // unknown reply - neznama odpoved NotImplemented, // CommandFailed, // failed command - chybny prikaz VarUnknown, // values isn't selected by driver - promena neni driverem podporovana VarNotSupported, // cannot get data for this values - neni mozno zislat data pro tuto promenou InvalidValue, // unknown value - nespravna hodnota UnknownInstCmd, // unknown instant command / neznamy okamzity prikaz CmdNotSupported, // this instant command isn't supported - tento okamzity prikaz neni podporovan NotConnection, // operace nelze provest protoze neni provedeno pripojeni // this not error NoListVars}; //upsd doesn't return list of variables, variable for STATUS has got value WAIT enum typeOfStatus { NS = 0, // - NONE status of UPS wasn't read OFF = 1, // - UPS is off (not supplying power) OL = 2, // - UPS is online (supplying power from the line/mains) OB = 4, // - UPS is on battery LB = 8, // - UPS battery is low (with OB = shutdown situation) CAL = 16, // - UPS is performing calibration TRIM = 32, // - UPS is trimming incoming voltage (APC "SmartTrim") BOOST = 64, // - UPS is boosting incoming voltage (APC "SmartBoost") OVER = 128, // - UPS is overloaded RB = 256, // - UPS battery needs to be replaced WAIT = 512, // - UPS as for waiting CHRG = 1024 // - UPS battery is charged }; enum keyWord { NONE, OK, ERR, BEGIN, END, VAR, TYPE, DESC, UPSDESC, CMDDESC, UPS, LIST, RW, CMD, ENUM, STARTTLS, BEGIN_LIST_VAR, BEGIN_LIST_RW, BEGIN_LIST_CMD, BEGIN_LIST_UPS, BEGIN_LIST_ENUM, END_LIST_VAR, END_LIST_RW, END_LIST_CMD, END_LIST_UPS, END_LIST_ENUM }; enum flagsVar { RW_FLAG = 1, ENUM_FLAG = 2, STRING_FLAG = 4 }; /** * Constructor sets basic variables and structures only, but doesn't read variables from server NUT * Konstruktor pouze nastavi zakladni promene a struktury, ale necte promene se serveru NUT. * @param upsName in name of UPS * @param upsAddress Is address of UPS (adresa pocitace na ktery je UPS pripojena) * netAddress can is entered like ip address or domain name * example: localhost karel.domain,cz 194.212.25.55. * @param tPort Is name if port, for NUT server (NUT is received on this port), default is 3493. * @param delay is delay in msec. System waits before one tries to make connection again. When test of connection fails, * @param countRepeat is maximal number of repeating for make connection. * * Since 0.7.5 version protocol UDP is not supported * @param upsAddress Je adresa ups-ky (adresa pocitace na ktery je UPS pripojena) * netAddress muze byt zadan jako ip adresa nebo domenove jmeno pocitace * @param upsName je jmeno UPSky * pr.: localhost karel.domena.cz 194.212.25.55. * @param tPort je cislo portu na kterem nasloucha NUT server, default je 3493. * @param delay je zpozdeni v msec, System ceka nez znovu pokusi ukutecnit spojeni. Kdyz pokus o spojeni selhal. * @param countRepeat je maximalni pocet opakovani spojeni pro navazani spojeni. * Od verze 0.7 neni podporovano UDP * * @since 0.7.5 **/ KNutNet (const QString upsAddress, const QString upsName="", const unsigned short port=3493, unsigned int countRepeat =0, const unsigned int delay = 200); /** * @since 0.5 **/ ~KNutNet(); /** * Zavre spojeni a nastavi hodnoty pro novou UPSku * Closes conneting and sets values for new UPS * * @since 0.1 **/ void newUPS (const QString upsAddress, const QString upsName, const unsigned short port=3493); /** * Provadi spojeni * Makes conneting * * @since 0.1 **/ void open (void); /** * Zavre spojeni * Closes conneting * * @since 0.1 **/ void close (void); /** * Returns kod of error, which is setted after last colling of same function this calls. * Error NotConnected isn't returned (not for function getError, getState). * It means then error NotConnected isn't remembered. * Vraci kod chyby, ktera nastala pri poslednim volani kterekoliv funkce * teto tridy (s vyjimkou getError, getState ), * chyba NotConnected neni vracena; * To znamena ze chyba NotConnected neni zapamatovana. * * * @since 0.5 **/ NetError getError ( void ) { return m_errorState; }; /** * Vraci stav pripojeni. * Returns state of connection. * * @since 0.5 **/ NetState getState ( void ) { return m_state; }; /** * Returns state of description, if descriptions is loaded. * Vraci stav popisu, zda je nahran; * * @since 0.5 **/ bool isDescription ( void ); /** * Vraci zda doslo k prepnuti z UDP do TCP; * Ma vyznam je pro verzi protokolu 2 * * @since 0.1 **/ bool switchedToTCP ( void ); /** * Vraci cislo protokolu pro komunikaci s NUT * Returns nunber of protocol for comunications with NUT * Od verze NUTu 1.3 je zmenen protokol * Since version 1.3 protocol is changed * * @since 0.1 **/ int getNutProtocol ( void ); /** * Return number of NUT's version * Vraci cislo verze nazvu NUT-u * Since version if nut 1.3 are changed names of values * Od verze NUTu 1.3 jsou zmeneny nazvy promenych * * @since 0.1 **/ nutVarVersion getNutVariables ( void ); /** * Nacte vsechny promene UPS-ky a nastavi jejich typ (znakove/char, vyctove/enum a status) * Nastavi priznak aktivity jen pro status. * Funkce vraci kod chyby nebo 0 pokud k chybe nedojde; * Vzdy jsou nacteny i hodnoty promenych. * * @since 0.6.1 **/ NetError getUpsVars ( void); /** * Nacte hodnoty vsech promenych UPS-ky pokud je nastaven jejich priznak aktivity, * nebo je nastaven allVars na true. * Pozor po provedeni getUpsVars je priznak aktivity nastaven jen pro status. * * @param allVars Urcuje zda se prikaz tyka vsech promenych, nebo jen tech ktere * maji nastaven priznak aktivity na TRUE. * * @since 0.6.1 **/ NetError getUpsValues (const bool allVars=true ); /** * Nacte popisy pro kazdou promennou * Read descriptions for every variable * * @param always Urcuje zda se nacteny provede vzdy nebo jen kdy popis jeste * nebyl nacten. * * @since 0.6 **/ int getDescription (bool always = false); /** * Provede okamzity prikaz. * Vraci 0 pokud provedeni skoncilo v poradku jinak kod chyby. * * @param command Udava nazev prikazu. * @param userName Udava uzivatelske jmeno. * @param password Udava heslo. * @param onlyCommand udava zda ma byt poslan pouze prikaz, nebo i nastaveno uzivatelske jmeno a heslo. * POZOR!! uzivatelske jmeno nejde zmenit bez odpojeni a znovu pripojeni. * * @since 0.7 **/ int instantCommand (const QString command, const QString userName, const QString password, const bool onlyCommand = false); /** * Nastavi RW promenou. * Vraci 0 pokud provedeni skoncilo v poradku jinak kod chyby; * * @param variable Udava nazev promenne. * @param value Udava hodnotu. * @param userName Udava uzivatelske jmeno. * @param password Udava heslo. * @param onlyVariable udava zda ma byt poslana pouze zadost na zmenu promenne, nebo i nastaveno uzivatelske jmeno a heslo. * POZOR!! uzivatelske jmeno nejde zmenit bez odpojeni a znovu pripojeni. * * @since 0.7 **/ int setVariable (const QString variable, const QString value, const QString userName, const QString password, const bool onlyVariable = false); /** * Returns number of UPS's variables. On error -1 is returned. * Vrati pocet promenych UPS-ky. Pri chybe vraci -1. * * @param typVar Is type of variable, its number is found out. * @param typVar Je typ promene pro ktere zjistujeme pocet * muze se jednat o RO promenne RW promene nebo o vsechny promenne. * * @since 0.6 **/ int readNumberVars (typeOfVar typVar = AllVars); /** * Returns number of UPS's commands. On erroe -1 is returned. * Vrati pocet prikazu UPS-ky. Pri chybe vraci -1. * * @since 0.6 **/ int readNumberComms (void); /** * Nastavi strukturu udavajici vsechny hodnoty pro prikaz. * Pri chybe vrati kod chyby * * @param seqNumber Udava cislo promene. * @param upsIComm Je struktura upsICommDef. * * @since 0.6 **/ int readIComm (const int seqNumber, upsICommDef& upsIComm); /** * Nastavi strukturu obsahujici vsechny udaje promene. * Pri chybe vrati kod chyby. * * @param name Udava jmeno promene. * * @since 0.6 **/ int readVars (const QString name, struct upsVarDef& allVar); /** * Nastavi strukturu obsahujici vsechny udaje promene. * Pri chybe vrati kod chyby. * * @param seqNumber Udava poradove cislo promene, ta zacina VZDY cislem 1. * @param typVar Udava typ promene /RO/RW/ALL. * * @since 0.6 **/ int readVars (const int seqNumber, struct upsVarDef& allVar, const typeOfVar typVar = AllVars); /** * Vrati hodnotu promenne. * Pri chybe vrati 0l. * * @param name Udava jmeno promene. * * @since 0.6.1 **/ QString readStringVar (const QString name); /** * Nacte jednu z hodnot vyctove promenne. * Vraci jednu z hodnot vyctove promenne udanou poradovym cislem hodnoty. * Pri chybe vrati 0l. * * @param name Udava nazev vyctove promenne. * @param valueNumber Udava poradove cislo hodnoty vyctove promenne. * @param enumValue Je naplnena hodnotou vyctove promenne. * * @since 0.6.1 **/ QString readEnumValueVar (const QString name, const int valueNumber); /** * Vraci kod stavu (statusu) UPS-ky * kody je mozne scitat napt OB+LB = 12 * OFF = 1, UPS-ka je vypnuta * OL = 2, UPS-ka bezi na sit * OB = 4 UPS-ka bezi na baterie * LB = 8 baterie je vybyta (pokud je zaroven OB dojde k shutdownu) * CAL = je spustena kalibrace UPS-ky * OVER =128 UPS-ka je pretizena * RB = 256 UPS-ka pozaduje vymenu baterie * * @since 0.5 **/ int readStatus(void); /** * Nastavi priznak aktivity. * Pri chybe vrati kod chyby. * * @param name Udava jmeno promene. * * @since 0.3 **/ int setActiveUpsVar ( const QString name, const bool active = true ); /** * Zrusi priznak aktivity. * Pri chybe vrati kod chyby. * * @param name Udava jmeno promene. * * @since 0.3 **/ int setUnactiveUpsVar ( const QString name, const bool unactive = true ) {return setActiveUpsVar (name, !unactive);}; /** * Nastavi priznak aktivity pro VSECHNY promene. * Pri chybe vrati kod chyby. * * @since 0.6 **/ int setActiveAllUpsVars ( const bool active = true ); /** * Zrusi nastaveni priznaku aktivity pro VSECHNY promene. * Pri chybe vrati kod chyby. * * @since 0.6 **/ int setUnactiveAllUpsVars ( const bool unactive = true ) {return setActiveAllUpsVars (!unactive);}; /** * Testuje zda existuje promena danneho jmena. * POZOR ZMENA v NAVRATOVYCH HODNOTACH * Vraci 0 pokud existuje. * Pokud neexistuje nebo pri chybe vrati kod chyby. * * @param name Udava jmeno promene. * * @since 0.6 **/ int existName ( const QString name ); /********* Consts ****************/ static const int initState = OL; signals: /** * Signal je vyslan, kdyz dojde k chybe. * Signal is emited, when error is occurred * * param@ error je cislo chyby. * param@ error je value of error. **/ void connectionError(int error); /** * Signal je vyslan, kdyz druha starna uzavrela spojeni. * Signal is emited, when other side closed connection. * * @since 0.1 **/ void connectionClosedByServer (void); /** * Signal je vyslan, kdyz dojde k prvemu spojeni se serverem. * Signal is emited, when the first connection with server is realized * * @since 0.1 **/ void firstConnection(void); /** * Signal je vyslan, kdyz dojde k dalsimu spojeni se serverem, znovu pripojeni. * Signal is emited, when next connection with server is realized, reconnect. * * @since 0.1 **/ void nextConnection(void); /** * Signal je vyslan, kdyz prevod jmena byl uspesny. * Signal is emited, when host lookup has succeeded * * @since 0.1 **/ void hostFound(void); /** * Signal je vyslan, kdyz spojeni je opet zkouseno. * Signal is emited, when connection is tried again. * * @since 0.1 **/ void tryRepeatFirstConnection( int ); /** * Signal je vyslan, kdyz spojeni je zkouseno poprve. * Signal is emited, when connection is tried at first. * * @since 0.1 **/ void tryFirstConnection( int); void getVarDesc (int count, int item); /********* Private part **********/ private: class KNutSleep : public QThread { public: static void msleep ( int delay) { QThread:: msleep (delay); }; }; // internal funkcion /** * Cleans input buffer * Vycisti vstupni buffer * * @since 0.1 **/ void cleanConnecting (void); /** * Prevede textovy nazev klice na jeho numerickou hodnotu * Jen pro protokol verze 2. * Funkce vraci kod klice; * param@ line textovy nazev klice. * * @since 0.1 **/ int setKey (const QString line); QString parseValue (const QString line); /** * Parsuje typ promenne (RW ENUM STRING). * Jen pro protokol verze 2. * Funkce vraci soucet kodu typu promenych; * param@ line retezec ktery se parsuje. * param@ lenString vraci maximalni delka promenne typu STRING. * * @since 0.1.1 **/ int parseTypeValue (QString line, int& lenString ); /** * Parsuje navratovou hodnotu z upsd (protokol klient-server). * Jen pro protokol verze 2. * Funkce vraci kod prikazu (UPS, VAR BEGIN_LIST_VAR ); * * @since 0.1 **/ int parseLine(QString& line, QString& upsName ,QString& varName, QString& value, int& typeValue, int& lenString); /** * Nacte popisy pro kazdou promennou * Jen pro protokol verze 1. * * @param always Urcuje zda se nacteny provede vzdy nebo jen kdy popis jeste * nebyl nacten. * * @since 0.1 **/ int getDescription1 (bool always = false); /** * Nacte popisy pro kazdou promennou * Jen pro protokol verze 2. * * @param always Urcuje zda se nacteny provede vzdy nebo jen kdy popis jeste * nebyl nacten. * * @since 0.1 **/ int getDescription2 (bool always = false); /** * internal * Nacte nazev prvni UPS-ky na danne adrese. * Jen pro protokol verze 2 * Funkce vraci kod chyby nebo 0 pokud k chybe nedojde; * * @since 0.1 **/ NetError getFirstUpsName (QString& firstUpsName); /** * internal * Nacte vsechny promene UPS-ky a nastavi jejich typ (znakove/char, vyctove/enum a status) * nastavi priznak aktivity jen pro status. * Jen pro protokol verze 2 * Funkce vraci kod chyby nebo 0 pokud k chybe nedojde; * * @since 0.1 **/ NetError getUpsVars1 ( void); /** * internal * Nacte vsechny promene UPS-ky a nastavi jejich typ (znakove/char, vyctove/enum a status) * nastavi priznak aktivity jen pro status. * Jen pro protokol verze 2 * Funkce vraci kod chyby nebo 0 pokud k chybe nedojde; * * @since 0.2 **/ NetError getUpsVars2 ( void); /** * Nacte hodnoty vsech promenych UPS-ky pokud je nastaven jejich priznak aktivity, * nebo je nastaven allVars na true. * * @param allVars Urcuje zda se prikaz tyka vsech promenych, nebo jen tech ktere * maji nastaven priznak aktivity na TRUE. * Jen pro protokol verze 1 * * @since 0.6 **/ NetError getUpsValues1 (const bool allVars ); /** * Nacte hodnoty vsech promenych UPS-ky pokud je nastaven jejich priznak aktivity, * nebo je nastaven allVars na true. * * @param allVars Urcuje zda se prikaz tyka vsech promenych, nebo jen tech ktere * maji nastaven priznak aktivity na TRUE. * Jen pro protokol verze 2 * * @since 0.6 **/ NetError getUpsValues2 (const bool allVars ); /** * @internal * Zjisti verzi upsd * * @param countRepeat maximalni pocet pokusu (ne opakovani !!) * @param delay zpozdeni, cas mezi opakovani */ int version (int countRepeat, const int delay); /** * @internal * Nenastavuje promenou error. * Doesn't set variable error */ NetError getUpsData (const QByteArray sbuffer, QString& rbuffer, const QByteArray endString = (QByteArray)""); /** * @internal **/ void setRWVars (const QString varName, const bool valueType, const int varMax, QVector* enumValues); /** * @internal **/ void upsSetType (struct upsVarDef& upsVar, const QString name, const QString value = ""); /** * @internal **/ NetError upsTranslateError (const QString string); /** * @internal **/ void deleteVars (void); /** * @internal **/ NetError upsOldTranslateError (const QString string); /** * @internal * Pro qt mensi nez 3.0.0 nemuze byt value const */ void genStatusFlags (QString value); /** * @internal * Nenastavuje promenou error. */ NetError sendComm (const QString command, const QString arg1, const QString arg2, const bool useUpsName=false); /** * @internal **/ NetError newDescription (const QByteArray inBuffer, QString& upsDescription); private slots: void slotConnectionError(QAbstractSocket::SocketError socketError); void slotConnected(void); void slotTimerReconnect(void); void slotHostFound(void); // void slotConnectionClosed(void); void slotDisconnected (void); private: /******* CONST ********/ static const qint64 rBufferLen = 1024; QTcpSocket *m_commandSocket; QTimer *m_unConnectTimer; /****** VARS *************/ QString m_upsAddress; QString m_upsName; unsigned int m_countRepeat; unsigned short m_port; unsigned int m_delay; NetState m_state; NetError m_errorState; bool m_firstConnect; unsigned int m_numberConnection; int m_nutProtocol; // 1 for NUT <1.3, 2 for NUT => 1.3 nutVarVersion m_nutVariables; // 0 for unknown 1 for NUT <1.3, 2 for NUT => 1.3 int m_numberVars; // number of all variables - pocet vsech promennych int m_numberRWVars; int m_numberIComms; int m_upsStatusVar; bool m_description; bool m_switchToTCP; QMutex m_getUpsDataMutex; QVector m_listVars; QVector m_listIComms; /********* Pomocne promenne ***********/ int m_posChar; }; #endif knc105/src/knutclient.cpp0000644000175000017500000012710611436653645013644 0ustar dandan/*************************************************************************** * Copyright (C) 2009 by Daniel Prynych,,, * * Daniel at prynych.cz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "knutclient.h" #include "knutnet.h" #include "knutupsdata.h" #include "knutanalog.h" #include "knutfrontpanel.h" #include "knutnewupsdlg.h" #include "knutdock.h" #include #include #include #include #include #include #include #include #include #include #include #include #include // for function sleep and other ... // const char *nameUpsVars1[] = { // "NONE", "UTILITY", "BATTPCT", "UPSTEMP", "ACFREQ", "LOADPCT", "AMBTEMP", "AMBHUMID","BATTVOLT","OUTVOLT",CURRENT}; // const char *nameUpsVars2[] = { // "none", "input.voltage", "battery.charge", "ups.temperature", "input.frequency", "ups.load", "ambient.temperature", //"ambient.humidity","battery.voltage","output.voltage","output.current","battery.temperature","battery.current"}; KNutClient::KNutClient(bool noDock, QWidget* parent) : QWidget(parent) { kapp->setQuitOnLastWindowClosed(false); upsRecords = new KNutUpsData(); analogRecords = new KNutVarData(); m_upsTimer = new QTimer (this); m_upsTimer->setSingleShot( TRUE ); connect( m_upsTimer, SIGNAL(timeout()), SLOT(slotTimeout()) ); m_reconnectTimer = new QTimer(this); connect( m_reconnectTimer, SIGNAL(timeout()), SLOT(slotReconnectTimeout()) ); // data for combo m_listKNutEvent = new QStringList(); // init and load of configuration initVars(); loadConfiguration(); if (!noDock) { m_myDock = new KNutDock(&m_mainUpsInfo,&settingData,upsRecords); m_myDock->show(); connect(m_myDock, SIGNAL(endApplication()), this, SLOT(slotExitApplication())); connect(m_myDock, SIGNAL(activeMainWindow()), this, SLOT(slotActiveMainWindow())); connect(m_myDock, SIGNAL(minimize()), this, SLOT(slotCloseMainWindow())); connect(m_myDock, SIGNAL(UPSChanged(QString)), this, SLOT(slotSetNewUPS (QString))); connect(m_myDock, SIGNAL(preferences()),this, SLOT(slotPreferenceUps())); connect(m_myDock, SIGNAL(printUPSVars()),this, SLOT(slotPrintUPSVars())); connect(m_myDock, SIGNAL(instComms()),this, SLOT(slotInstComms())); connect(m_myDock, SIGNAL(RWVars()),this, SLOT(slotRWVars())); connect(m_myDock, SIGNAL(makeRefreshConnection()),this, SLOT(slotRefreshConnection())); } addEventString(i18n("Ready.")); // nastavime data pro vybranou polozku // sets data for selected item setActiveUpsInfo(m_mainUpsInfo.record.name); // sets mainUpsInfo.oldState to const value KNutNet::initStatus m_mainUpsInfo.oldState=KNutNet::initState; //makes connect to UPS, connection is non blocking operation //we have to use signal firstConnection and connectionError from KNutNet class m_mainUpsInfo.upsNet = new KNutNet( m_mainUpsInfo.record.upsAddress, m_mainUpsInfo.record.upsName, m_mainUpsInfo.record.port,5,200); connect(m_mainUpsInfo.upsNet, SIGNAL(firstConnection(void)),this, SLOT(slotFirstConnection(void))); connect(m_mainUpsInfo.upsNet, SIGNAL(connectionError(int)),this, SLOT(slotErrorConnection(int))); connect(m_mainUpsInfo.upsNet, SIGNAL(connectionClosedByServer(void)),this, SLOT(slotConnectionClosedByServer(void))); connect(m_mainUpsInfo.upsNet, SIGNAL(tryFirstConnection(int)),this, SLOT(slotTryFirstConnection(int))); connect(m_mainUpsInfo.upsNet, SIGNAL(tryRepeatFirstConnection(int)),this, SLOT(slotTryReepatFirstConnection(int))); // repaints the dock if (m_myDock) m_myDock->clearDockValues(); if (settingData.useMainWindow == knc::mw_yes || noDock || (settingData.useMainWindow == knc::mw_auto && settingData.activatedMainWindow )) makeMainWindow (); //tries connecting to server m_mainUpsInfo.upsDriverState=knc::connecting; m_mainUpsInfo.upsNet->open(); } KNutClient::~KNutClient() { // melo by uz byt zruseno - jistota if (m_myDock) { delete m_myDock; m_myDock=NULL;} if (m_mainUpsInfo.upsNet) { // melo by uz byt zruseno - jistota delete m_mainUpsInfo.upsNet; m_mainUpsInfo.upsNet = 0; } m_listKNutEvent->clear(); delete m_listKNutEvent; // melo by uz byt zruseno - jistota if (mainWindow) delete mainWindow; delete upsRecords; delete analogRecords; } void KNutClient::slotErrorConnection (int error) { qDebug ("KNutClient::slotErrorConnection -------------- %i",error); if (mainWindow) mainWindow->hideConnectPB(); m_mainUpsInfo.netError = error; m_mainUpsInfo.errorUpsData=true; if (m_mainUpsInfo.netError == KNutNet::DriverNotConnected) m_mainUpsInfo.upsDriverState=knc::notConnected; else m_mainUpsInfo.upsDriverState=knc::error; if (m_myDock) m_myDock->repaintDock(true); if (m_mainUpsInfo.reconnecting) { m_mainUpsInfo.reconnectCount++; if (m_mainUpsInfo.reconnectCount > countNextConnDelay) m_mainUpsInfo.reconnectCount = countNextConnDelay; addEventString(i18n("The connection failed. The next connection will make after %1 sec.").arg(nextConnDelay[m_mainUpsInfo.reconnectCount-1]),m_mainUpsInfo.record.name); m_reconnectTimer->setSingleShot( TRUE ); m_reconnectTimer->start( nextConnDelay[m_mainUpsInfo.reconnectCount-1]*1000); // starts reconnect timer again } else { slotSendMessage (KNutVarData::errorToText(m_mainUpsInfo.netError),"errorConn_event"); } } //-------------------- Procedures ----------------// void KNutClient::initVars (void) { // Nasledujici data jsou nastavena pri natazeni konfigurace //Next data is setted when konfiguration is loaded settingData.panelFlags = KNutFrontPanel::DefaultPanelFlags; // informace v hlavnim panelu // information in main panel settingData.toolTipDockFlags = KNutDock::DefaultToolTipFlags; // informace v hlavnim panelu // information in main panel m_mainUpsInfo.record.name=""; m_mainUpsInfo.upsNet=0; m_mainUpsInfo.netError=0; // no error zadna chyba m_mainUpsInfo.name=""; m_mainUpsInfo.password=""; m_mainUpsInfo.errorUpsData=false; m_mainUpsInfo.nutVariables=KNutNet::versionVarUnknown; m_mainUpsInfo.runtimeVar=""; m_mainUpsInfo.lowxferVar=""; m_mainUpsInfo.highxferVar=""; m_mainUpsInfo.statusVar=""; m_mainUpsInfo.upsLoadVar=""; m_mainUpsInfo.upsDriverState=knc::notConnected; m_mainUpsInfo.reconnectCount = 1; m_mainUpsInfo.reconnecting = false; m_panelsAreZeroing=false; m_lastError=0; // no error mainWindow=0; m_myDock=0; settingData.activatedMainWindow=false; // settingData.x=0; // settingData.y=0; // settingData.width=300; // settingData.height=200; } void KNutClient::loadConfiguration ( void ) { qDebug ("KNutClient::loadConfiguration ( void )"); QString groupName; KNutUpsData::upsRecordDef upsData; // structure includes informations about UPS // struktura obsahuje udaje o UPS QFont appFont = kapp->font(); // systemovy font pri startu KConfigGroup config = KGlobal::config()->group(""); settingData.areYouSure=config.readEntry("AreYouSure",false); settingData.useMainWindow=(knc::mainWindowStartVariant)config.readEntry("UseMainWindow",int(knc::mw_auto)); settingData.useMessageWindow=config.readEntry("UseMessageWindow",false); settingData.activatedMainWindow=config.readEntry("PreviousMainWindow",false); settingData.useDescription=config.readEntry("UseDescription",false); settingData.countCols=config.readEntry("NumberOfCols",int(knc::DefaultCountCols)); settingData.panelFlags=config.readEntry("PanelFlags",(unsigned int)(KNutFrontPanel::DefaultPanelFlags)); settingData.inputFrequency=config.readEntry("InputFrequency",int(knc::DefaultInputFrequency)); settingData.inputVoltage=config.readEntry("InputVoltage",int(knc::DefaultInputVoltage)); settingData.lowHighXfer=config.readEntry("LowHighXfer",false); settingData.customFont=config.readEntry("CustomFont",false); settingData.aPanelFont=config.readEntry("AnalogPanelFont",QFont(appFont)); settingData.mPanelFont=config.readEntry("MainPanelFont",QFont(appFont)); int upsCount=config.readEntry("NumberOfUpsRecords",int(0)); settingData.customBColor=config.readEntry("CustomBColor",false); settingData.mainBackgroundColor=config.readEntry ("MainBackGroundColor",QColor( knc::defaultBGColor)); settingData.customBPanelColor=config.readEntry("CustomBPanelColor",false); settingData.customBAnalogColor=config.readEntry("CustomBAnalogColor",false); settingData.customOAnalogColor=config.readEntry("CustomOAnalogColor",false); settingData.mPanelBackgroundColor=config.readEntry ("MPanelBackGroundColor",QColor(knc::defaultBGColor)); settingData.aPanelBackgroundColor=config.readEntry ("APanelBackGroundColor",QColor(knc::defaultBGColor)); settingData.analogFingerColor=config.readEntry ("AnalogFingerColor",QColor(knc::defaultFingerColor)); settingData.analogOKColor=config.readEntry ("AnalogOKColor",QColor(knc::defaultOkColor)); settingData.analogWarnningColor=config.readEntry ("AnalogWarnningColor",QColor(knc::defaultWarnningColor)); settingData.analogErrorColor=config.readEntry ("AnalogErrorColor",QColor(knc::defaultErrorColor)); settingData.analogScaleColor=config.readEntry ("AnalogScaleColor",QColor(knc::defaultScaleColor)); settingData.analogFontColor=config.readEntry ("AnalogFontColor",QColor(knc::defaultFontColor)); settingData.toolTipDockFlags=config.readEntry("ToolTipFlags",(unsigned int)(KNutDock::DefaultToolTipFlags)); settingData.customKIconColor=config.readEntry("CustomKIconColor",false); settingData.kIconBackgroundColor=config.readEntry ("KIconBackGroundColor",QColor(knc::defaultKIconColor)); settingData.typeOfKIcon=config.readEntry("TypeOfKIcon", int(KNutDock::pictureKI)); settingData.typeDigitalProcessing=config.readEntry("DigitalProcessingOfPointers", int(2)); m_mainUpsInfo.record.name=config.readEntry("ActiveUps",""); config = KGlobal::config()->group("MainWindow"); for (int i = 0; i < upsCount; i++) { groupName.sprintf ("UPS %d",i); //kapp->config()->setGroup (groupName); config = KGlobal::config()->group(groupName); if (!((upsData.name = config.readEntry ("Name","")).isEmpty())) { // record exist, we will go to next part //if ActiveUps is empty, we use name of first ups from ups list if ((m_mainUpsInfo.record.name.isEmpty()) && (!(upsData.name.isEmpty()))) m_mainUpsInfo.record.name = upsData.name; upsData.upsName = config.readEntry ("UpsName",""); upsData.upsAddress = config.readEntry ("UpsAddress",""); if ((!( upsData.upsAddress.isEmpty())) || (( upsData.upsAddress.isEmpty()) && (!(upsData.upsName.isEmpty())))) { // only for backwards compatibility with older release then 0.7 if (upsData.upsAddress.isEmpty()) { int charPos; if ((charPos=upsData.upsName.indexOf('@')) == -1) { upsData.upsAddress=upsData.upsName; upsData.upsName=""; } else { upsData.upsAddress=upsData.upsName.mid(charPos+1); upsData.upsName=upsData.upsName.left(charPos); } } // zaznam existuje pokracujeme dale a nacteme zbytek hodnotet // record exists, we go next and will read rest of values upsData.delay = config.readEntry("Delay",int(knc::DefaultDelay)); upsData.port = (quint16)config.readEntry("Port",uint(knc::DefaultPort)); upsData.userName=config.readEntry("UserName",""); upsData.password=config.readEntry("Password",""); upsData.savePassword=config.readEntry("SavePassword",false); for (int j=0; j < knc::NumberOfVars; j++) { groupName.sprintf ("Var %d",j); upsData.upsVarCode[j]=config.readEntry (groupName,int(0)); if ((upsData.upsVarCode[j] < 0) || (upsData.upsVarCode[j] > knc::NumberOfTypes)) upsData.upsVarCode[j] = 0; } upsRecords->add (upsData); } } } } void KNutClient::saveAllConfiguration ( void ) { saveCommonConfiguration (); savePreferencesConfiguration(); syncConfiguration(); } void KNutClient::syncConfiguration ( void ) { KConfigGroup config = KGlobal::config()->group(""); config.sync(); } void KNutClient::saveCommonConfiguration ( void ) { KConfigGroup config = KGlobal::config()->group(""); config.writeEntry ("PreviousMainWindow",settingData.activatedMainWindow); KNutUpsData::upsRecordDef upsData; // struktura obsahuje udaje o UPS // structure includes information about UPS // active UPS //if name of active ups isn't knowly, will use name of the firt ups from ups list if ((m_mainUpsInfo.record.name.isEmpty()) && (upsRecords->getCount() > 0)) { upsRecords->get(0,upsData); config.writeEntry ("ActiveUps",upsData.name); } else config.writeEntry ("ActiveUps",m_mainUpsInfo.record.name); // } void KNutClient::savePreferencesConfiguration ( void ) { QString groupName; QString codeName; KNutUpsData::upsRecordDef upsData; // struktura obsahuje udaje o UPS // structure includes information about UPS int upsCount = upsRecords->getCount(); KConfigGroup config = KGlobal::config()->group(""); config.writeEntry ("DigitalProcessingOfPointers",int(settingData.typeDigitalProcessing)); config.writeEntry ("TypeOfKIcon",int(settingData.typeOfKIcon)); config.writeEntry ("KIconBackGroundColor",QColor(settingData.kIconBackgroundColor)); config.writeEntry ("CustomKIconColor",settingData.customKIconColor); config.writeEntry ("ToolTipFlags",(unsigned int)(settingData.toolTipDockFlags)); config.writeEntry ("AnalogFontColor",QColor(settingData.analogFontColor)); config.writeEntry ("AnalogScaleColor",QColor(settingData.analogScaleColor)); config.writeEntry ("AnalogErrorColor",QColor(settingData.analogErrorColor)); config.writeEntry ("AnalogWarnningColor",QColor(settingData.analogWarnningColor)); config.writeEntry ("AnalogOKColor",QColor(settingData.analogOKColor)); config.writeEntry ("AnalogFingerColor",QColor(settingData.analogFingerColor)); config.writeEntry ("APanelBackGroundColor",QColor(settingData.aPanelBackgroundColor)); config.writeEntry ("MPanelBackGroundColor",QColor(settingData.mPanelBackgroundColor)); config.writeEntry ("MainBackGroundColor",QColor(settingData.mainBackgroundColor)); config.writeEntry ("NumberOfUpsRecords",upsCount); config.writeEntry ("CustomFont",settingData.customFont); //bool config.writeEntry ("AnalogPanelFont",QFont(settingData.aPanelFont)); //QFont config.writeEntry ("MainPanelFont",QFont(settingData.mPanelFont)); //QFont config.writeEntry ("CustomBColor",settingData.customBColor); config.writeEntry ("CustomBPanelColor",settingData.customBPanelColor); config.writeEntry ("CustomBAnalogColor",settingData.customBAnalogColor); config.writeEntry ("CustomOAnalogColor",settingData.customOAnalogColor); config.writeEntry ("LowHighXfer",settingData.lowHighXfer); config.writeEntry ("InputVoltage",settingData.inputVoltage); config.writeEntry ("InputFrequency",settingData.inputFrequency); config.writeEntry ("PanelFlags",uint(settingData.panelFlags | 3)); config.writeEntry ("NumberOfCols",settingData.countCols); config.writeEntry ("UseDescription",settingData.useDescription); config.writeEntry ("AreYouSure",settingData.areYouSure); config.writeEntry ("UseMainWindow",int(settingData.useMainWindow)); // cast enum type to int type config.writeEntry ("UseMessageWindow",settingData.useMessageWindow); for (int i=0; igroup(groupName); upsRecords->get(i,upsData); config.writeEntry ("Port",uint(upsData.port)); config.writeEntry ("Delay",upsData.delay); config.writeEntry ("UpsAddress",upsData.upsAddress); config.writeEntry ("UpsName",upsData.upsName); config.writeEntry ("Name",upsData.name); if (upsData.savePassword) { config.writeEntry ("UserName",upsData.userName); config.writeEntry ("Password",upsData.password); } config.writeEntry ("SavePassword",upsData.savePassword); for (int j=0; j < knc::NumberOfVars; j++) { groupName.sprintf ("Var %d",j); config.writeEntry (groupName,upsData.upsVarCode[j]); } config = KGlobal::config()->group(""); } } bool KNutClient::commitData (QSessionManager&) { saveCommonConfiguration (); syncConfiguration(); return true; } void KNutClient::upsDeactivate (void) { qDebug("KNutClient::upsDeactivate"); // this function isn't interuptable function QMutexLocker upsDeactivateLocker( &m_upsDeactivateMutex ); m_upsTimer->stop(); m_mainUpsInfo.upsNet->close(); // close connection // state of connection to usbd, this isn't state of knutnet m_mainUpsInfo.upsDriverState=knc::notConnected; m_mainUpsInfo.netError=0; // no error m_mainUpsInfo.nutVariables=KNutNet::versionVarUnknown; } void KNutClient::setActiveUpsVars ( bool setVarsForMainWindowAlways ) { qDebug("KNutClient::setActiveUpsVars"); // sets when same variables are existed if ( m_mainUpsInfo.upsNet->readNumberVars() > 0) { // deaktivujeme veskere promene // unactivates all variables m_mainUpsInfo.upsNet->setUnactiveAllUpsVars(); if (( mainWindow) || (setVarsForMainWindowAlways) ) { for (int j=0; j < knc::NumberOfVars; j++) { if (m_mainUpsInfo.record.upsVarCode[j] != 0 ) { m_mainUpsInfo.upsNet->setActiveUpsVar(KNutVarData::nameUpsVar(m_mainUpsInfo.record.upsVarCode[j],m_mainUpsInfo.nutVariables)); } } } if (m_myDock) m_mainUpsInfo.upsNet->setActiveUpsVar(m_mainUpsInfo.upsLoadVar); //runtime je vzdy pridano v merenym polozkam m_mainUpsInfo.upsNet->setActiveUpsVar(m_mainUpsInfo.runtimeVar); // status se nastavi vzdy m_mainUpsInfo.upsNet->setActiveUpsVar(m_mainUpsInfo.statusVar); // xfer se nastavi vzdy pokud existuje // potrebujeme ho znat jeste pred startem a pak behen behu programu setActiveXFerVars(true); } } bool KNutClient::saveState (QSessionManager&) { saveCommonConfiguration (); syncConfiguration(); return true; } void KNutClient::getUpsData (void) { int runNetError; qDebug("KNutClient::getUpsData"); runNetError=m_mainUpsInfo.upsNet->getUpsValues(false); if (!(runNetError) && (!(m_mainUpsInfo.errorUpsData))) { m_mainUpsInfo.netError=runNetError; qDebug("Data OK -> Data OK"); return; } if (!(runNetError) && (m_mainUpsInfo.errorUpsData)) { qDebug("Data Error -> Data OK"); m_mainUpsInfo.netError=runNetError; m_mainUpsInfo.errorUpsData=false; slotSendMessage (i18n("Data OK"),"ok_event"); return; } if ((runNetError) && (!m_mainUpsInfo.errorUpsData)) { qDebug("Data OK -> Data Error"); m_mainUpsInfo.netError=runNetError; slotSendMessage (KNutVarData::errorToText(runNetError),"error_event"); m_lastError=runNetError; m_mainUpsInfo.errorUpsData=true; return; } if ((runNetError) && (m_mainUpsInfo.errorUpsData)) { qDebug("Data Error -> Data Error"); m_mainUpsInfo.netError=runNetError; if (m_lastError != runNetError) { // change status from error to other error slotSendMessage (KNutVarData::errorToText(runNetError),"error_event"); m_lastError=runNetError; } return; } } void KNutClient::setActiveXFerVars (bool activate) { if (activate) { // podkud neexistuje jedna z promenych neaktivujeme ani jednu if (!(m_mainUpsInfo.upsNet->setActiveUpsVar(m_mainUpsInfo.lowxferVar))) if (m_mainUpsInfo.upsNet->setActiveUpsVar(m_mainUpsInfo.highxferVar)) m_mainUpsInfo.upsNet->setActiveUpsVar(m_mainUpsInfo.lowxferVar,false); } else { m_mainUpsInfo.upsNet->setActiveUpsVar(m_mainUpsInfo.lowxferVar,false); m_mainUpsInfo.upsNet->setActiveUpsVar(m_mainUpsInfo.highxferVar,false); } } void KNutClient::setActiveUpsInfo (const QString &name) { //presuneme jmena z databaze ups-ek - je nahrana z config. souboru KNutUpsData::upsRecordDef* upsRecordPointer; if ((!name.isNull()) && (!name.isEmpty()) && ((upsRecordPointer = upsRecords->findName(name)) != NULL)) { m_mainUpsInfo.record.upsName = upsRecordPointer->upsName; m_mainUpsInfo.record.upsAddress = upsRecordPointer->upsAddress; m_mainUpsInfo.record.delay = upsRecordPointer->delay; m_mainUpsInfo.record.port = upsRecordPointer->port; m_mainUpsInfo.record.userName = upsRecordPointer->userName; m_mainUpsInfo.record.password = upsRecordPointer->password; for (int i =0; i < knc::NumberOfVars; i++) m_mainUpsInfo.record.upsVarCode[i] = 0; // vynulujeme polozky int ii = 0; for (int i =0; i < knc::NumberOfVars; i++) if (upsRecordPointer->upsVarCode[i]>0) m_mainUpsInfo.record.upsVarCode[ii++] = upsRecordPointer->upsVarCode[i]; } } void KNutClient::addEventString (const QString text, const QString UPSAddress) { qDebug ("KNutClient::addEventString"); QString eventText(QDate::currentDate().toString()); eventText +=" " + QTime::currentTime().toString(); if (UPSAddress.isEmpty()){ eventText +=" "+text; } else { eventText +=" "+UPSAddress+" : "+text; } if (mainWindow) { mainWindow->addComboStatusItem (eventText); } m_listKNutEvent->append(eventText); if (m_listKNutEvent->count() > knc::maxCountKNutEvent) { m_listKNutEvent->takeFirst(); //uses takeFirst() because one is fastly next remove(..begin) } } void KNutClient::showStatusEvent(void) { //qDebug ("KNutClient::showStatusEvent"); int myState = m_mainUpsInfo.upsNet->readStatus(); if (myState != m_mainUpsInfo.oldState) { if ((myState & KNutNet::OFF) != (m_mainUpsInfo.oldState & KNutNet::OFF)) { if (myState & KNutNet::OFF) { slotSendMessage (i18n("UPS is off."),"upsOff_event"); } else { slotSendMessage (i18n("UPS is back on."),"upsBack_event"); } } if ((myState & KNutNet::OL) != (m_mainUpsInfo.oldState & KNutNet::OL)){ if (myState & KNutNet::OL) { slotSendMessage (i18n("Power is back online."),"powerBack_event"); } } if ((myState & KNutNet::OB) != (m_mainUpsInfo.oldState & KNutNet::OB)) { if (myState & KNutNet::OB) { slotSendMessage (i18n("UPS is on battery."),"upsOnBatt_event"); } } if ((myState & KNutNet::LB) != (m_mainUpsInfo.oldState & KNutNet::LB)) { if (myState & KNutNet::LB) { slotSendMessage (i18n("UPS battery is low."),"battLow_event"); } else { slotSendMessage (i18n("UPS battery is OK."),"battOK_event"); } } if ((myState & KNutNet::RB) != (m_mainUpsInfo.oldState & KNutNet::RB)) { if (myState & KNutNet::RB) { slotSendMessage (i18n("UPS battery is bad and needs be replaced."),"battRep_event"); } } if ((myState & KNutNet::OVER) != (m_mainUpsInfo.oldState & KNutNet::OVER)) { if (myState & KNutNet::OVER) { slotSendMessage (i18n("UPS is overloaded."),"overOn_event"); } else { slotSendMessage (i18n("UPS isn't overloaded."),"overOff_event"); } } if ((myState & KNutNet::CAL) != (m_mainUpsInfo.oldState & KNutNet::CAL)) { if (myState & KNutNet::CAL) { slotSendMessage (i18n("UPS is performing calibration."),"calOn_event"); } else { slotSendMessage(i18n("Calibration of UPS is ended."),"calOff_event"); } } if ((myState & KNutNet::BOOST) != (m_mainUpsInfo.oldState & KNutNet::BOOST)) { if (myState & KNutNet::BOOST) { slotSendMessage(i18n("UPS is boosting incoming voltage."),"boostOn_event"); } else { slotSendMessage(i18n("Boosting of UPS is ended."),"boostOff_event"); } } if ((myState & KNutNet::TRIM) != (m_mainUpsInfo.oldState & KNutNet::TRIM)) { if (myState & KNutNet::TRIM) { slotSendMessage(i18n("UPS is trimming incoming voltage."),"trimOff_event"); } else { slotSendMessage (i18n("Trimming of UPS is ended."),"trimOff_event"); } } m_mainUpsInfo.oldState=myState; } } void KNutClient::makeMainWindow (void) { qDebug ("KNutClient::makeMainWindow"); mainWindow = new KNutMainWindow(m_listKNutEvent ,&m_mainUpsInfo, &settingData, upsRecords, analogRecords); connect(mainWindow, SIGNAL(UPSChanged (QString)), this, SLOT(slotSetNewUPS (QString))); connect(mainWindow, SIGNAL(preferenceUps()),this, SLOT(slotPreferenceUps())); connect(mainWindow, SIGNAL(showUPSVars()),this, SLOT(slotPrintUPSVars())); connect(mainWindow, SIGNAL(makeInstComms()),this, SLOT(slotInstComms())); connect(mainWindow, SIGNAL(makeRWVars()),this, SLOT(slotRWVars())); connect(mainWindow, SIGNAL(makeRefreshConnection()),this, SLOT(slotRefreshConnection())); connect(mainWindow, SIGNAL(saveConf()),this, SLOT(slotSaveConf())); connect(mainWindow, SIGNAL(endApplication()), this, SLOT(slotExitApplication())); connect(mainWindow, SIGNAL(destroyed()), this, SLOT(slotMainWindowDestroyed())); } /*********************************************************************************************/ /* */ /* PRIVATE SLOTS */ /* */ /*********************************************************************************************/ void KNutClient::slotTryFirstConnection (int maxCount) { qDebug ("KNutClient::slotTryFirstConnection"); //KNutNet begin the first test of connection (connectToHost will be made after emiting signal tryFirstConnection ) // repaints icon if (m_myDock) m_myDock->repaintDock(true); if (mainWindow) mainWindow->startConnectPB(maxCount); } void KNutClient::slotTryReepatFirstConnection (int number ) { qDebug ("KNutClient::slotTryReepatFirstConnection"); //KNutNet begin nexts test /the second ..../ of connection if (mainWindow) mainWindow->setProgressConnectPB (number); } void KNutClient::slotFirstConnection (void) { qDebug ("KNutClient::slotFirstConnection"); //TCP - UDP connection to server was made bool reconnecting = m_mainUpsInfo.reconnecting; m_mainUpsInfo.reconnecting =false; m_reconnectTimer->stop(); m_mainUpsInfo.nutVariables = m_mainUpsInfo.upsNet->getNutVariables(); m_mainUpsInfo.nutProtocol = m_mainUpsInfo.upsNet->getNutProtocol(); if (mainWindow) mainWindow->hideConnectPB(); // reads UPS's variables int countRevision = 2; // pocet max opakovani po kterych muzeme zjistovat hodnoty do { if (!(m_mainUpsInfo.netError = m_mainUpsInfo.upsNet->getUpsVars())) break; if (!(m_mainUpsInfo.netError)) break; // no error if (m_mainUpsInfo.netError == KNutNet::UnknownUps) break; if (m_mainUpsInfo.netError == KNutNet::DriverNotConnected) break; countRevision--; if (countRevision) sleep (2); } while (countRevision); if (m_mainUpsInfo.netError) { m_mainUpsInfo.errorUpsData=true; // mainUpsInfo.upsDriverState is state of connection to usbd, this isn't state of knutnet if (m_mainUpsInfo.netError == KNutNet::DriverNotConnected) m_mainUpsInfo.upsDriverState=knc::notConnected; else m_mainUpsInfo.upsDriverState=knc::error; if (m_myDock) m_myDock->repaintDock(true); slotSendMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),"errorConn_event"); } else { if (reconnecting) { slotSendMessage(i18n("The connection was renewed."),"connRenewed_event"); } m_mainUpsInfo.upsDriverState=knc::connected; m_mainUpsInfo.errorUpsData=false; switch (m_mainUpsInfo.nutVariables) { // type of variables, old or new (with dot) case KNutNet::versionVarOne : if (!(m_mainUpsInfo.upsNet->existName("BATT_RUNTIME"))) m_mainUpsInfo.runtimeVar="BATT_RUNTIME"; else m_mainUpsInfo.runtimeVar="RUNTIME"; m_mainUpsInfo.upsLoadVar="LOADPCT"; m_mainUpsInfo.lowxferVar="LOWXFER"; m_mainUpsInfo.highxferVar="HIGHXFER"; m_mainUpsInfo.statusVar="STATUS"; break; case KNutNet::versionVarTwo: m_mainUpsInfo.runtimeVar="battery.runtime"; m_mainUpsInfo.upsLoadVar="ups.load"; m_mainUpsInfo.lowxferVar="input.transfer.low"; m_mainUpsInfo.highxferVar="input.transfer.high"; m_mainUpsInfo.statusVar="ups.status"; break; case KNutNet::versionVarUnknown: m_mainUpsInfo.runtimeVar=""; m_mainUpsInfo.upsLoadVar=""; m_mainUpsInfo.lowxferVar=""; m_mainUpsInfo.highxferVar=""; m_mainUpsInfo.statusVar=""; break; } if ((settingData.useDescription) && (!m_mainUpsInfo.upsNet->isDescription())) m_mainUpsInfo.upsNet->getDescription(); // test presunut do setActiveUpsVars setActiveUpsVars(); //sets all variables like active variables // ones will be read // repaints main window and dock immediately if (mainWindow) mainWindow->showUpsData(); //sets value of front panel if (m_myDock) m_myDock->repaintDock(true); // dock is repainting always m_panelsAreZeroing=false; // analog panels isn't setting to zero } if ((m_mainUpsInfo.upsNet->getState() == KNutNet::Connected) && (!m_mainUpsInfo.errorUpsData)) { showStatusEvent(); // getUpsVars loads informations about variables, but their values too //starts timer immediately we needs new data m_upsTimer->setSingleShot( TRUE ); m_upsTimer->start( 1); // nastartujeme casovac - starts timer } } void KNutClient::slotConnectionClosedByServer(void) { qDebug("KNutClient::slotConnectionClosedByServer "); m_upsTimer->stop(); // state of connection to usbd, this isn't state of knutnet m_mainUpsInfo.upsDriverState=knc::notConnected; m_mainUpsInfo.nutVariables=KNutNet::versionVarUnknown; m_mainUpsInfo.netError = KNutNet::ConnetionClosedByServer; if (mainWindow) { mainWindow->hideConnectPB(); mainWindow->cleanPanels(); } if (m_myDock) { // clears values of dock and set standard icon of dock m_myDock->clearDockValues(); } slotSendMessage(i18n("The connection was closed by the second side (upsd)."),"connClosedSecondSide_event"); m_mainUpsInfo.reconnecting = true; m_mainUpsInfo.reconnectCount = 1; m_reconnectTimer->setSingleShot( TRUE ); m_reconnectTimer->start( nextConnDelay[0]*1000 ); // start timer for reconnect delay } void KNutClient::slotTimeout (void) { qDebug("KNutClient::slotTimeout"); getUpsData(); if (!m_mainUpsInfo.errorUpsData) { // no error if (mainWindow) { mainWindow->repaintPanel(); mainWindow->repaintAnalogs(); } m_panelsAreZeroing=false; showStatusEvent(); if (m_myDock) m_myDock->repaintDock(); } else { // error if ((mainWindow) && (!m_panelsAreZeroing)) mainWindow->zeroingPanels(); m_panelsAreZeroing=true; if (m_myDock) m_myDock->clearDockValues(); if (m_myDock) m_myDock->repaintDock(true); } // if (m_myDock) m_myDock->repaintDock(); m_upsTimer->setSingleShot( TRUE ); m_upsTimer->start( m_mainUpsInfo.record.delay ); // nastartujem znovu } void KNutClient::slotReconnectTimeout (void) { qDebug("KNutClient::slotReconnectTimeout"); m_mainUpsInfo.netError=0; //clears netError m_mainUpsInfo.upsDriverState=knc::connecting; m_mainUpsInfo.upsNet->open(); } void KNutClient::slotPreferenceUps (void) { qDebug("KNutClient::slotPreferenceUps"); KNutPrefDlg* prefDlg = new KNutPrefDlg ( upsRecords, analogRecords, &settingData, m_mainUpsInfo.record.name ); // aktivujeme dialog pro preference connect (prefDlg,SIGNAL(signalChangeConfig(unsigned int)),this,SLOT(slotSetConfig(unsigned int))); prefDlg->exec(); delete prefDlg; } void KNutClient::slotSetConfig (unsigned int changeSetting) { if (changeSetting) { // cely blok konfiguraci ukladame jen zde // all block of configurations is saved only here saveAllConfiguration(); if (changeSetting & KNutPrefDlg::ChangeXFer) { if (settingData.lowHighXfer) setActiveXFerVars(false); else setActiveXFerVars(true); } if (changeSetting & KNutPrefDlg::ChangeUpsSetting) { //we have changed active UPS //********** same code like code into slotSetNewUPS -- stejny kod jako v slotSetNewUPS upsDeactivate(); if (m_mainUpsInfo.record.name == "") { // the first record was added, because the first UPS is active UPS always QString name = upsRecords->getName(0); addEventString(i18n("Switched"),name); m_mainUpsInfo.record.name=name; m_mainUpsInfo.errorUpsData=false; saveCommonConfiguration (); // saves information of new/first active UPS } else { if (upsRecords->getCount() == 0) { // the last record was deleted, because the last UPS is active UPS addEventString(i18n("Switched"),""); m_mainUpsInfo.record.name=""; m_mainUpsInfo.errorUpsData=false; m_mainUpsInfo.record.upsName = ""; m_mainUpsInfo.record.upsAddress = ""; saveCommonConfiguration (); // saves information of no UPS, list of UPS is empty } } setActiveUpsInfo(m_mainUpsInfo.record.name); // zde je nutno hned provest prekresleni // showUpsData je nutno udelat take proto ze se mohl zmenit vyber meraku // if (mainWindow) mainWindow->showUpsData(); if (mainWindow) mainWindow->cleanPanels(); // if (myDock) myDock->repaintDock(mainUpsInfo.netError); if (m_myDock) m_myDock->clearDockValues(); //newUPS close connection and sets paremetrs of new UPS m_mainUpsInfo.upsNet->newUPS(m_mainUpsInfo.record.upsAddress,m_mainUpsInfo.record.upsName, m_mainUpsInfo.record.port); // state of connection to usbd, this isn't state of knutnet m_mainUpsInfo.upsDriverState=knc::connecting; m_mainUpsInfo.upsNet->open(); // opens connections } if (changeSetting & KNutPrefDlg::ChangeUpsCount) { if (m_myDock) m_myDock->changeUps(); } if (changeSetting & KNutPrefDlg::ChangeTypeOfKIcon) { if (m_myDock) m_myDock->changeKIcon(); } if (changeSetting & KNutPrefDlg::ChangeCustomKIconColor) { if (m_myDock) m_myDock->changeKIBColor(); } if (changeSetting & KNutPrefDlg::ChangeKIconBColor) { if (m_myDock) m_myDock->changeKIBColor(); } if (changeSetting & KNutPrefDlg::ChangeToolTip) { if (m_myDock) m_myDock->changeToolTip(); } //for other settings will call functions from mainWindow class if (mainWindow) mainWindow->setConfig (changeSetting); } } void KNutClient::slotPrintUPSVars(void) { if (m_mainUpsInfo.upsDriverState == knc::connected) { if (!m_mainUpsInfo.errorUpsData) { if ((m_mainUpsInfo.upsNet->readNumberVars (KNutNet::AllVars)) || (m_mainUpsInfo.upsNet->readNumberComms ())) { KNutPrintUpsVar *windowUpsVars = new KNutPrintUpsVar(m_mainUpsInfo.upsNet,settingData.useDescription,(m_myDock) && (settingData.useMessageWindow)); windowUpsVars->exec(); delete windowUpsVars; } } else { slotSendMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),"errorConn_event"); } } else { slotSendMessage(KNutVarData::errorToText(KNutNet::NotConnection),"notConnection_event"); } } void KNutClient::slotInstComms(void) { if (m_mainUpsInfo.upsDriverState == knc::connected) { if (!m_mainUpsInfo.errorUpsData) { if (m_mainUpsInfo.upsNet->readNumberComms ()) { KNutInstComms *windowInstComms = new KNutInstComms(&m_mainUpsInfo.name,&m_mainUpsInfo.password,m_mainUpsInfo.record.userName,m_mainUpsInfo.record.password,m_mainUpsInfo.upsNet); connect(windowInstComms,SIGNAL(signalShowMessage(QString, QString)),this,SLOT(slotSendMessage(QString,QString))); if (windowInstComms->isUpsOk()) windowInstComms->exec(); disconnect(windowInstComms,SIGNAL(signalShowMessage(QString, QString)),this,SLOT(slotSendMessage(QString,QString))); delete windowInstComms; } } else { slotSendMessage(KNutVarData::errorToText(m_mainUpsInfo.netError),"errorConn_event"); } } else { slotSendMessage(KNutVarData::errorToText(KNutNet::NotConnection),"notConnection_event"); } } void KNutClient::slotRWVars(void) { if (m_mainUpsInfo.upsDriverState == knc::connected) { if (!m_mainUpsInfo.errorUpsData) { if (m_mainUpsInfo.upsNet->readNumberVars (KNutNet::RWVars)) { KNutRWVar *windowRWVars = new KNutRWVar(&m_mainUpsInfo.name,&m_mainUpsInfo.password,m_mainUpsInfo.record.userName,m_mainUpsInfo.record.password,m_mainUpsInfo.upsNet); //++ connect (windowRWVars,SIGNAL(signalChangeRWVars(QString)),this,SLOT(slotChangeRWVars(QString))); connect(windowRWVars,SIGNAL(signalShowMessage(QString, QString)),this,SLOT(slotSendMessage(QString,QString))); if (windowRWVars->isUpsOk()) windowRWVars->exec(); disconnect(windowRWVars,SIGNAL(signalShowMessage(QString, QString)),this,SLOT(slotSendMessage(QString,QString))); delete windowRWVars; } } else { slotSendMessage (KNutVarData::errorToText(m_mainUpsInfo.netError),"errorConn_event"); } } else { slotSendMessage (KNutVarData::errorToText(KNutNet::NotConnection),"notConnection_event"); } } void KNutClient::slotSendMessage (const QString &message, const QString &event) { if ((m_myDock) && (settingData.useMessageWindow)) { KNotification::event (event,message); } addEventString(message,m_mainUpsInfo.record.name); } void KNutClient::slotSetNewUPS (const QString name) { qDebug(" KNutClient::slotSetNewUPS"); //stops reconnecting m_mainUpsInfo.reconnecting =false; m_reconnectTimer->stop(); if (name != m_mainUpsInfo.record.name) { upsDeactivate(); addEventString(i18n("Switched"),name); m_mainUpsInfo.record.name=name; m_mainUpsInfo.errorUpsData=false; setActiveUpsInfo(m_mainUpsInfo.record.name); //new connection name and password are cleaned m_mainUpsInfo.name = ""; m_mainUpsInfo.password = ""; if (mainWindow) { mainWindow->setCombo(name); mainWindow->cleanPanels(); } if (m_myDock) { // clears values of dock and set standard icon of dock m_myDock->clearDockValues(); m_myDock->setNewUPS(); // sets miniIcon in list of UPSes for selected UPS } m_panelsAreZeroing=false; m_lastError=0; // zadna chyba m_mainUpsInfo.oldState=KNutNet::initState; // init variable of last UPS state m_mainUpsInfo.upsNet->newUPS(m_mainUpsInfo.record.upsAddress,m_mainUpsInfo.record.upsName, m_mainUpsInfo.record.port); // state of connection to usbd, this isn't state of knutnet m_mainUpsInfo.upsDriverState=knc::connecting; m_mainUpsInfo.upsNet->open(); } } void KNutClient::slotRefreshConnection(void) { qDebug("KNutClient::slotRefreshConnection"); m_reconnectMutex.lock(); m_mainUpsInfo.reconnecting =false; m_reconnectTimer->stop(); m_upsTimer->stop(); upsDeactivate(); // closes connections // nastavime na docku iconu // sets icon for dock if (m_myDock) { m_myDock->clearDockValues(); // myDock->initImage(); // myDock->repaint(); } if (mainWindow) { mainWindow->cleanPanels(); } addEventString(i18n("Reconnect"),m_mainUpsInfo.record.name); // mainUpsInfo.record.name=name; m_mainUpsInfo.errorUpsData=false; setActiveUpsInfo(m_mainUpsInfo.record.name); //new connection name and password are cleaned m_mainUpsInfo.name = ""; m_mainUpsInfo.password = ""; m_panelsAreZeroing=false; m_lastError=0; // zadna chyba m_mainUpsInfo.oldState=KNutNet::initState; m_mainUpsInfo.upsNet->newUPS(m_mainUpsInfo.record.upsAddress,m_mainUpsInfo.record.upsName, m_mainUpsInfo.record.port); // state of connection to usbd, this isn't state of knutnet m_mainUpsInfo.upsDriverState=knc::connecting; m_mainUpsInfo.upsNet->open(); m_reconnectMutex.unlock(); } void KNutClient::slotActiveMainWindow (void) { qDebug("KNutClient::slotActiveMainWindow (void)"); if (!mainWindow) { // pred activaci nastaveme promenne znovu precteme data // state of connection to usbd, this isn't state of knutnet if (m_mainUpsInfo.upsDriverState==knc::connected) { m_upsTimer->stop(); setActiveUpsVars(true); // true activate ups variable for main window too QTimer::singleShot(0, this, SLOT(slotTimeout())); // getUpsData(); makeMainWindow(); // if (m_myDock) m_myDock->repaintDock(m_mainUpsInfo.netError); // QTimer::singleShot(0, this, SLOT(slotTimeout())); } else { setActiveUpsVars(true); //getUpsData(); zrusene protoze kdyz nebylo spojeni navazeno vratil by prikaz // getValues error=0 a doslo by vypsani data ok. makeMainWindow(); if (!m_mainUpsInfo.errorUpsData) { if (m_myDock) m_myDock->repaintDock(m_mainUpsInfo.netError); } } } else { // end if mainWindow //activates main window mainWindow->show(); mainWindow->raise(); KWindowSystem::forceActiveWindow( mainWindow->winId()); } } void KNutClient::slotSaveConf (void) { saveAllConfiguration(); // saves all configuration // main window required } void KNutClient::slotMainWindowDestroyed (void) { qDebug("KNutClient::slotMainWindowDestroyed"); mainWindow=NULL; if (m_mainUpsInfo.upsNet) setActiveUpsVars(); // Pokud neni aktivovan dock musime ukoncit aplikaci.. // When dock isn't activated we must close application. if (m_myDock == 0) { saveCommonConfiguration (); syncConfiguration(); if (m_mainUpsInfo.upsNet) { delete m_mainUpsInfo.upsNet; m_mainUpsInfo.upsNet = NULL; } kapp->quit(); } } void KNutClient::slotCloseMainWindow (void) { qDebug ("KNutClient::slotCloseMainWindow"); if (mainWindow) { if (m_myDock) m_myDock->repaintDock(m_mainUpsInfo.netError); m_upsTimer->stop(); delete mainWindow; mainWindow=NULL; QTimer::singleShot(0, this, SLOT(slotTimeout())); } } void KNutClient::slotExitApplication(void) { if ((!(settingData.areYouSure)) || ((settingData.areYouSure) && (KMessageBox::questionYesNo (0,i18n("Are you sure ?"),"") == KMessageBox::Yes))) { m_upsTimer->stop(); if (mainWindow) { // odpojime protoze slotMainWindowDestroyed by byl vykonan az po zkonceni procedury; disconnect(mainWindow, SIGNAL(destroyed()), this, SLOT(slotMainWindowDestroyed())); delete mainWindow; mainWindow = NULL; } saveCommonConfiguration (); syncConfiguration(); if (m_mainUpsInfo.upsNet) { delete m_mainUpsInfo.upsNet; m_mainUpsInfo.upsNet = 0; } if (m_myDock) { delete m_myDock; m_myDock = 0;} kapp->quit(); } } #include "knutclient.moc" knc105/src/knutpanelmeter.h0000644000175000017500000001340711436653645014165 0ustar dandan/*************************************************************************** knutpanelmeter.h - description ------------------- begin : t b?e 16 2004 copyright : (C) 2004 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTPANELMETER_H #define KNUTPANELMETER_H #include "knutanalog.h" #include "knutvardata.h" #include class QWidget; class QFont; /** *@author Daniel Prynych */ class KNutPanelMeter : public QWidget { Q_OBJECT public: /** * Konstruktor * * @Param aPanelPalette je paleta pozadi subpanelu MERAKU !!! * @param activeUpsInfo ukazatel na data o aktivni UPS * @param settingData ukazatel na zakladni data programu (barvy pozadi, mezikruzi, rucicky ... ,fonty atd ) * @param analogRecords ukazatel na tridu ktera pracuje s daty o upsekach * * @since 0.2 **/ KNutPanelMeter(QPalette aPanelPalette, KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutVarData* analogRecords, QWidget *parent=0); /** * Destruktor * * @since 0.1 **/ ~KNutPanelMeter(); /** * Zrusi analogove panely vcetne uvoneni pameti. * * @since 0.1 **/ void deActivateAnalogs (void); /** * Vytvori a inicializuje analogove panely. * * @since 0.1 **/ void activateAnalogs (void); /** * Compute width a height of main panel, this widget * * @since 0.2 **/ void setSize ( void ); /** * Prekresli zmenu rozsahu pro dany typ analogoveho panelu (jenom jeden) * Pokud panel nepodporuje zmeny rozsahu neprovede nic. * Zmenu rozsahu podporuji nasledujici panely: Current,BattVolt,BattCurrent * * @param panelNumber is code of ups variable. * @param value je hodnota na kterou je panel nastaven. * * @since 0.1 **/ void repaintScaleAnalogPanel (int upsVarCode, float value); /** * Paints pointer for selected analog panel * Prekresli rucicku pro vybrany analogovy panel. * * @param panelNumber is number of analog panel. * @param value is value of settimg amalog panel. * @param run = TRUE makes immediately repaint of panel * @param panelNumber je cislo analogoveho panelu. * @param value je hodnota na kterou je panel nastaven. * * @since 0.2 **/ void repaintAnalogPointer (const int upsVarCode, const float value); /** * Repaints analog panels * Repainting range of panel for frequency and voltage, based on current setting. * Prekresli a prebarvi analogove panely. * Prekresuje rozsah panelu pro frekvenci a nepeti na zaklade soucasneho nastaveni. * * @param repaintRangeFrequencyPanels urcuje ze ma prekreslit rozsahy panelu ktere zobrazuji vstupni a vystupni frequency. * @param repaintRangeVoltagePanels urcuje ze ma prekreslit rozsahy panelu ktere zobrazuji vstupni a vystupni napeti. * @param repaintAllPanels urcuje ze ma prebarvit vsechny prvky panelu. !!!!Neprekresluje rozsahy. * *@param repaintRangeFrequencyPanels sets repainting ranges of panels for input and output frequency * * @since 0.1 **/ void repaintAnalogPanels (const bool repaintRangeFrequencyPanels, const bool repaintRangeVoltagePanels, const bool repaintAllPanels); /** * Changes type of digital processing of pointer and repaints it. * Zmeni zpusob digitalniho zpracovani rucucky a prekresli ji * * @since 0.1 **/ void changeAnalogPanelsDigProcessing (void); /** * Sets value of panels to zero * Nastavi hodnotu vsech panelu na nulu * * @since 0.1 **/ void zeroingPanels (void); /** * Repaints backgroud of analog panels * Prebarvi pozadi analogovych panelu. * * @param taPanelPalette je hodnota nove palety pro pozadi * * @since 0.1 **/ void setAnalogBG(const QPalette &aPanelPalette); /** * Vraci soucasnou velikost panelu. * * @since 0.1 **/ virtual QSize sizeHint (void) const; public slots: /** * Sets new font for all panels * Nastavy novy font ve vsech panelech. * * @since 0.1 **/ void slotSetPanelsFont(const QFont &newFont); private: void moveUpsAnalog (const int i, KNutAnalog *upsAnalog); /************ private const *****************/ static const int spacePanels = 2; //vzdalenost mezi meraky, length between panels static const int maxBattVolt = 350; // max battery.voltage static const int maxCurrent = 50; // max output.current static const int maxBattCurrent = 200; // max battery.current static const int minBattCurrent = -300; // max battery.current static const int maxUpsPower = 5000; // max ups.power /************ private struct ************************/ struct analogPanelRecordDef { int upsVarCode; int scaleEnd; int scaleStart; KNutAnalog* upsAnalogs; }; /*********** private vars *******************/ KNutVarData::SettingDataDef *m_settingData; // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci KNutVarData::upsInfoDef *m_activeUpsInfo; // values for selected ups -- hodnoty pro vybrane ups KNutVarData *m_analogRecords; QPalette m_aPanelPalette; typedef QList analogPanelsList; analogPanelsList m_analogPanels; int m_widthArea; int m_heightArea; }; #endif knc105/src/main.cpp0000644000175000017500000000600412073253305012364 0ustar dandan/*************************************************************************** * Copyright (C) 2009 by Daniel Prynych,,, * * Daniel@prynych.cz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "knutclient.h" #include #include #include #include #include #include static const char description[] = I18N_NOOP("Client for Network UPS Tool"); static const char version[] = "1.0.5"; int main(int argc, char **argv) { KAboutData about("knutclient", 0, ki18n("KNutClient"), version, ki18n(description), KAboutData::License_GPL, ki18n("(C) 2002 - 2013 Daniel Prynych"), ki18n("Zajecov, Czech Republic"), "http://www.knut.prynych.cz", "Daniel@prynych.cz"); about.addAuthor( ki18n("Daniel Prynych"), KLocalizedString(), "Daniel@prynych.cz", "http://www.knut.cz/" ); about.addCredit(ki18n("Arnaud Quette"),KLocalizedString(),"arnaud.quette@free.fr","http://www.networkupstools.org/"); about.addCredit( ki18n("MGE"),KLocalizedString(),0,"http://opensource.mgeups.com"); KCmdLineArgs::init(argc, argv, &about); KCmdLineOptions options; options.add("nodock", ki18n( "Don't dock in SysTray" )); KCmdLineArgs::addCmdLineOptions( options ); // Add our own options. KUniqueApplication::addCmdLineOptions(); KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); bool noDock = args->isSet("dock"); // main KUApp this is remark if (!KUniqueApplication::start()) { fprintf(stderr,"Sorry : KNutClient is already running!\n"); exit(0); } KUniqueApplication app; // next line is for testing only. // I don't debug KUniqueApplication // KApplication app; // KNutClient *knutclient = new KNutClient(!noDock); args->clear(); int returnCode = app.exec(); delete knutclient; return returnCode; } knc105/src/knutclient.h0000644000175000017500000001526211436653645013310 0ustar dandan/*************************************************************************** * Copyright (C) 2009 by Daniel Prynych,,, * * Daniel@prynych.cz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef KNUTCLIENT_H #define KNUTCLIENT_H #include "knutvardata.h" #include "knutupsdata.h" #include "knutnet.h" #include "knutdock.h" #include "knutprefdlg.h" #include "knutmainwindow.h" #include "knutprintupsvar.h" #include "knutrwvar.h" #include "knutinstcomms.h" #include #include #include #include #include const int countNextConnDelay = 10; const int nextConnDelay[] = { 5, 5, 20, 30, 60, 60, 120, 300, 600, 900 }; /** * This class have to been QWidget because sysTray parent is not QWidget class * and exec function from KPageDialog/KDialog/QDialog ends application when is main widget. * In Qt sysTray parent was QWidget * * **/ class KNutClient : public QWidget, public KSessionManager { Q_OBJECT public: KNutClient(bool noDock = false, QWidget* parent=0); virtual ~KNutClient(); private slots: /** * * Calls function for repainting of icon in dock. * Vola funkci pro prekresleni icony v doku. * * @since 0.2 **/ // void slotTryFirstConnection (int maxCount); void slotTryFirstConnection (int ); /** * This function is called when program repeats other connection; * Calls function for repainting of icon in dock. * Tata funkce je volana, kdyz program opakuje pokus o pripojeni. * Vola funkci pro prekresleni icony v doku. * * @since 0.2 **/ void slotTryReepatFirstConnection (int number ); /** * Nastavi hodnoty po prvem pripojeni na UPS, zavola prekresleni docku a nastartuje timer * Sets values after the first conection to UPS ,calls to repaint of dock and starts timer * * @since 0.2 **/ void slotFirstConnection (void); /** * Zpracuje chybu spojeni * Executes error of connection * * @since 0.1 **/ void slotErrorConnection (int error); /** * Zpracuje ukonceni spojeni, pokud spojeni bylo ukonceno druhou stranou. * Executes end of connection, when connection was closed by the second side. * * @since 0.1 **/ void slotConnectionClosedByServer(void); void slotTimeout (void); /** * Makes new connection on ups server (upsd). **/ void slotReconnectTimeout (void); /** * Makes referesh connection. * Intervals between connection is 5 , 5, 20, 30, 60, 60, 120, 300, 600, 900 sec. * * @since 0.1 **/ void slotRefreshConnection(void); void slotSetNewUPS (const QString name); void slotPreferenceUps (void); void slotSetConfig (unsigned int changeSetting); void slotPrintUPSVars(void); void slotInstComms(void); void slotRWVars(void); void slotCloseMainWindow (void); void slotMainWindowDestroyed (void); void slotActiveMainWindow (void); void slotExitApplication(void); void slotSaveConf (void); /** * Send messages to status line of mainWidow and to KDE messages viewer. * * @since 0.1 **/ void slotSendMessage (const QString &message, const QString &event); private: /** * Prepares and show main window. * Pripravi a zobrazi hlavni okno. * * @since 0.1 **/ void makeMainWindow (void); virtual bool commitData (QSessionManager&); virtual bool saveState (QSessionManager&); /** * Sets all variables to initial values. * Nastavi vsechny vsechny promenne na pocatecni hodnoty. * * @since 0.1 **/ void initVars (void); void loadConfiguration ( void ); /** * Runs saveCommonConfiguration and savePreferencesConfiguration. * Saves all configurations informations and call syncConfiguration. * * @since 0.1 **/ void saveAllConfiguration ( void); /** * Saves common configuration positions of main window, name of active ups * * @since 0.1 **/ void saveCommonConfiguration ( void ); /** * Saves configuration about proferences dialog .. fonts, colors, info about upses ... * * @since 0.1 **/ void savePreferencesConfiguration ( void ); void syncConfiguration ( void ); void getUpsData (void); /** * Sets selected ups vars like active, when main window is existed, procedure sets * ups variables ares showed in main window like active. Other ups variables will be * setted like unactive * * @since 0.1 **/ void setActiveUpsVars (bool setVarsForMainWindowAlways = false ); void setActiveXFerVars (bool activate); void upsDeactivate (void); void setActiveUpsInfo (const QString &name); void addEventString (const QString text, const QString UPSAddress = QString::null); void showStatusEvent(void); KNutVarData::upsInfoDef m_mainUpsInfo; // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci // in this structure are saveing values, which setting configuration KNutVarData::SettingDataDef settingData; KNutDock *m_myDock; KNutMainWindow *mainWindow; KNutUpsData *upsRecords; KNutVarData *analogRecords; QTimer *m_upsTimer; QTimer *m_reconnectTimer; QStringList *m_listKNutEvent; bool m_panelsAreZeroing; // indikuje zda je panel nulovany // use if analog panels is setting to zero // kod posledni chyby spojeni zjistene v timeoutu // nebere ohled zda byla chyba pri inicializaci int m_lastError; //code off last error from timeout // mutex for reconnect, only one reconnect at a time QMutex m_reconnectMutex; QMutex m_upsDeactivateMutex; }; #endif // _knutclient_H_ knc105/src/knutmainwindow.cpp0000644000175000017500000007151111436653645014540 0ustar dandan/*************************************************************************** knutmainwindow.cpp - description ------------------- begin : Po cen 16 2003 copyright : (C) 2003 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutmainwindow.h" #include "knutvardata.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const char *descrOfConnection = I18N_NOOP("test of conection from 5"); KNutMainWindow::KNutMainWindow(QStringList *tListKNutEvent, KNutVarData::upsInfoDef* tActiveUpsInfo, KNutVarData::SettingDataDef* tSettingData, KNutUpsData* tUpsRecords, KNutVarData* tAnalogRecords, QWidget* parent) : KXmlGuiWindow(parent), m_listKNutEvent(tListKNutEvent), m_activeUpsInfo(tActiveUpsInfo),m_settingData (tSettingData), m_upsRecords(tUpsRecords), m_analogRecords (tAnalogRecords) { qDebug("KNutMainWindow::KNutMainWindo"); m_settingData->activatedMainWindow=true; //information about state of mainWindow initVars(); initStatusBar(); initAction(); initToolBarAction(); // createGUI ("/home/dan/Projekty/knutclient/src/knutclientui.rc"); // pred distribuci nezapomenout odstranit retezec // createGUI vytvori zakladni strukturu podle souboru knutclientui.rc //createGUI (); setupGUI(); setToolBar(); m_descriptionAction->setChecked(m_settingData->useDescription); //sets input frequency and input voltage //nastavime vstupni frekvenci a vstupni napeti m_analogRecords->setFrequency(m_settingData->inputFrequency); m_analogRecords->setVoltage(m_settingData->inputVoltage); //sets palettes setPalettes(); // sets font for front panel QFont frontPanelFont; if (m_settingData->customFont) frontPanelFont = m_settingData->mPanelFont; else frontPanelFont = m_settingData->systemFont; // makes main area // Vytvorime hlavni plochu m_mainArea = new QWidget (this); setCentralWidget (m_mainArea); QHBoxLayout* mainLayout = new QHBoxLayout(m_mainArea); m_frontPanel = new KNutFrontPanel (m_mPanelPalette, frontPanelFont, m_mainArea, m_settingData->panelFlags); mainLayout->addWidget(m_frontPanel,0); //std::cout << "Hint " << m_frontPanel->sizeHint().width() << std::endl; //std::cout << "Maximum " << m_frontPanel->maximumWidth() << std::endl; //std::cout << "Minumum " << m_frontPanel->minimumWidth() << std::endl; QScrollArea *analogPanel = new QScrollArea(m_mainArea); m_panelMeter = new KNutPanelMeter(m_aPanelPalette,m_activeUpsInfo,m_settingData,m_analogRecords,analogPanel); //std::cout << "Maximum " << m_panelMeter->sizeHint().width() << std::endl; //std::cout << "Minumum " << m_panelMeter->minimumWidth() << std::endl; analogPanel->setWidget(m_panelMeter); analogPanel->setWidgetResizable (false); mainLayout->addWidget(analogPanel,0); setPalette(m_areaPalette); m_mainArea->setPalette(m_areaPalette); m_panelMeter->setPalette(m_areaPalette); // we have to set palette this again, because command "setPalette(m_areaPalette)" sets same palette for children widget too m_frontPanel->setPalette(m_mPanelPalette); // sets Combo a actives connections to meter panels // Nastavime COMBO a pripadne aktivujeme spojeni na merici panely int activeUpsNameIndex = activeMainCombo(); if (activeUpsNameIndex != -1) m_upsComboBox->setCurrentIndex( activeUpsNameIndex ); //creates analogs showUpsData(); //loads position KConfigGroup config = KGlobal::config()->group("MainWindow"); move(config.readEntry("PosX",int(0)), config.readEntry("PosY",int(0))); show(); initStatusBarMessage(); } void KNutMainWindow::addComboStatusItem (const QString &text) { if (m_infoCombo->count() >= knc::maxCountKNutEvent) m_infoCombo->removeItem(0); m_infoCombo->addItem(text); m_infoCombo->setCurrentIndex(m_infoCombo->count()-1); } KNutMainWindow::~KNutMainWindow(void) { saveConfiguration(); delete m_frontPanel; delete m_panelMeter; } void KNutMainWindow::setConfig (unsigned int changeSetting) { KNutVarData::VarStrucDef analogMemberData; bool repaintVoltagePanels = false; bool repaintFrequencyPanels = false; bool repaintAllPanels = false; bool repaintOAPanels = false; // Main Setting // sets background color for mainArea if (changeSetting & KNutPrefDlg::ChangeCustomBColor) { if (!m_settingData->customBColor) { // nastavime barvu pozadi podle systemu setPalette (m_mainPalette); // we set background color based on system m_mainArea->setPalette (m_mainPalette); // we set background color based on system m_panelMeter->setPalette (m_mainPalette); repaint(); } else { m_areaPalette.setColor(QPalette::Active,QPalette::Background,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Background,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Active,QPalette::Base,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Base,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Active,QPalette::Button,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Button,m_settingData->mainBackgroundColor); setPalette (m_areaPalette); m_mainArea->setPalette (m_areaPalette); m_panelMeter->setPalette (m_areaPalette); repaint(); } } else { if (changeSetting & KNutPrefDlg::ChangeMBColor ) { m_areaPalette.setColor(QPalette::Active,QPalette::Background,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Background,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Active,QPalette::Base,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Base,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Active,QPalette::Button,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Button,m_settingData->mainBackgroundColor); setPalette (m_areaPalette); m_mainArea->setPalette (m_areaPalette); m_panelMeter->setPalette (m_areaPalette); repaint(); } } // Sets background for panels // sets frequence // sets voltage // XFer is switch-on and one exist for this UPS if ((changeSetting & KNutPrefDlg::ChangeXFer) || // je provedena nejaka zmena na napeti nebo frekvence (changeSetting & KNutPrefDlg::ChangeVoltage) || (changeSetting & KNutPrefDlg::ChangeFrequency)) { if ((changeSetting & KNutPrefDlg::ChangeXFer) && (m_settingData->lowHighXfer) && (m_existLowHighXfer)) { // xfer was activated if (changeSetting & KNutPrefDlg::ChangeXFer) { if (abs((int)(230 - (m_lowXfer + (m_highXfer - m_lowXfer) /2))) > abs((int)(120 - (m_lowXfer + (m_highXfer - m_lowXfer) /2)))) { m_analogRecords->setVoltage(120); m_analogRecords->setFrequency(60); } else { m_analogRecords->setVoltage(230); m_analogRecords->setFrequency(50); } m_analogRecords->setXfer(m_lowXfer,m_highXfer); repaintVoltagePanels = true; repaintFrequencyPanels = true; } } else { // XFER neni aktivovano nebo je nepodporuje UPS // XFER isn;t activated or XFER isn't supported by UPS if ((changeSetting & KNutPrefDlg::ChangeVoltage) || ((changeSetting & KNutPrefDlg::ChangeXFer))) { // byla aktivovana zmena napeti nebo zmena xfer a zaroven ho ups podporuje m_analogRecords->setVoltage(m_settingData->inputVoltage); repaintVoltagePanels=true; } if ((changeSetting & KNutPrefDlg::ChangeFrequency) || ((changeSetting & KNutPrefDlg::ChangeXFer))) { // byla aktivovana zmena napeti nebo zmena xfer a zaroven ho ups podporuje m_analogRecords->setFrequency(m_settingData->inputFrequency); repaintFrequencyPanels=true; } } } // Analog setting // now DigitalProcesing of pointer if (changeSetting & KNutPrefDlg::ChangeTypeOfDigProcessing) { //type of digital processing was changed m_panelMeter->changeAnalogPanelsDigProcessing(); //paint pointers with new digotal processing } if ((changeSetting & KNutPrefDlg::ChangeCustomAPanelBColor) || // barva panelu je zmenena, panel color is changed (changeSetting & KNutPrefDlg::ChangeAPBColor)) { if (m_settingData->customBAnalogColor) { m_aPanelPalette.setColor(QPalette::Active,QPalette::Background,m_settingData->aPanelBackgroundColor); m_aPanelPalette.setColor(QPalette::Inactive,QPalette::Background,m_settingData->aPanelBackgroundColor); repaintAllPanels=true; m_panelMeter->setAnalogBG(m_aPanelPalette); } else { m_aPanelPalette = m_mainPalette; repaintAllPanels=true; m_panelMeter->setAnalogBG(m_aPanelPalette); } } if ((changeSetting & KNutPrefDlg::ChangeCustomAPanelOColor) || // je provedena zmena barvy panelu (changeSetting & KNutPrefDlg::ChangeAPOColor)) { if (m_settingData->customOAnalogColor) { repaintAllPanels=true; repaintOAPanels=true; } else { repaintAllPanels=true; repaintOAPanels=true; } } // regeneration of panel uses for setting Main and setting Analog // pregenerovani panelu slozi pro setting Main a setting Analog m_panelMeter->repaintAnalogPanels (repaintFrequencyPanels, repaintVoltagePanels, repaintAllPanels); if (m_activeUpsInfo->record.name != "") { // m_mainSplitter->refresh(); } // UPS Setting if (changeSetting & KNutPrefDlg::ChangeUpsSetting ) activeMainCombo(); else { if (changeSetting & KNutPrefDlg::ChangeUpsCount) activeMainCombo(); } // Main Panel Setting // change of background color // zmena barvy pozadi; if (changeSetting & KNutPrefDlg::ChangeCustomMPanelBColor) { if (!m_settingData->customBPanelColor) { // nastavime barvu pozadi podle systemu m_frontPanel->setPalette (m_mainPalette); } else { m_mPanelPalette.setColor(QPalette::Active,QPalette::Background,m_settingData->mPanelBackgroundColor); m_mPanelPalette.setColor(QPalette::Inactive,QPalette::Background,m_settingData->mPanelBackgroundColor); m_mPanelPalette.setColor(QPalette::Active,QPalette::Button,m_settingData->mPanelBackgroundColor); m_mPanelPalette.setColor(QPalette::Inactive,QPalette::Button,m_settingData->mPanelBackgroundColor); m_frontPanel->setPalette (m_mPanelPalette); } } else { if (changeSetting & KNutPrefDlg::ChangeMPBColor ) { m_mPanelPalette.setColor(QPalette::Active,QPalette::Background,m_settingData->mPanelBackgroundColor); m_mPanelPalette.setColor(QPalette::Inactive,QPalette::Background,m_settingData->mPanelBackgroundColor); m_mPanelPalette.setColor(QPalette::Active,QPalette::Button,m_settingData->mPanelBackgroundColor); m_mPanelPalette.setColor(QPalette::Inactive,QPalette::Button,m_settingData->mPanelBackgroundColor); m_frontPanel->setPalette (m_mPanelPalette); } } if (changeSetting & KNutPrefDlg::ChangeMainPanelSetting ) { if (m_settingData->panelFlags != m_frontPanel->getPanelFlags()) { m_frontPanel->setPanelFlags(m_settingData->panelFlags); //aktivujema a presuneme prvky panelu // activates and moves items of panel m_frontPanel->paintPanel(); } } // Font panel setting if (changeSetting & KNutPrefDlg::ChangeAnalogFont ) { QFont newAnalogFont; if (m_settingData->customFont) { newAnalogFont=m_settingData->aPanelFont; } else { newAnalogFont=m_settingData->systemFont; } m_panelMeter->slotSetPanelsFont(newAnalogFont); } if (changeSetting & KNutPrefDlg::ChangePanelFont ) { QFont newPanelFont; if (m_settingData->customFont) { m_frontPanel->slotSetPanelFont(m_settingData->mPanelFont); } else { m_frontPanel->slotSetPanelFont(m_settingData->systemFont); } } } void KNutMainWindow::showUpsData (void) { qDebug ("KNutMainWindow::showUpsData"); if ((m_activeUpsInfo->upsNet != 0) && (!m_activeUpsInfo->netError) && (m_activeUpsInfo->upsDriverState == knc::connected)) { QString nutStringVar; bool okNumber; //front panel part int upsStatus=0; if ((upsStatus = m_activeUpsInfo->upsNet->readStatus ()) != -1) { m_frontPanel->setPanel(upsStatus); } // Nastaveni nemenych dat jsou precteny pouze jednou, predpoklada se jejich nemenost // setting of unchange data, ones are reading only one. nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->lowxferVar); switch (m_activeUpsInfo->nutVariables) { case KNutNet::versionVarOne: m_manufacturer = m_activeUpsInfo->upsNet->readStringVar("MFR"); m_upsModel = m_activeUpsInfo->upsNet->readStringVar("MODEL"); m_serial = m_activeUpsInfo->upsNet->readStringVar("SERIAL"); m_firmrev = m_activeUpsInfo->upsNet->readStringVar("FIRMREV"); break; case KNutNet::versionVarTwo: m_manufacturer = m_activeUpsInfo->upsNet->readStringVar("ups.mfr"); m_upsModel = m_activeUpsInfo->upsNet->readStringVar("ups.model"); m_serial = m_activeUpsInfo->upsNet->readStringVar("ups.serial"); m_firmrev = m_activeUpsInfo->upsNet->readStringVar("ups.firmware"); break; case KNutNet::versionVarUnknown: m_manufacturer = ""; m_upsModel = ""; m_serial = ""; m_firmrev = ""; break; } QString allUpsName = m_manufacturer + " " + m_upsModel; m_frontPanel->setAllNameUps (allUpsName); m_frontPanel->setMFRUps (m_manufacturer); m_frontPanel->setNameUps (m_upsModel); m_frontPanel->setSerialUps (m_serial); m_frontPanel->setFirmRevUps (m_firmrev); // try if LOWXFER and HIGHXFER or our values are existed //Zjistime zda existuji LOWXFER a HIGHXFER pripadne jeji hodnoty // analog panel part int runtimeVal =0; if ( !m_activeUpsInfo->upsNet->existName(m_activeUpsInfo->runtimeVar)) { nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->runtimeVar); if (nutStringVar.isEmpty()) runtimeVal=knc::numberVarError; else { runtimeVal=nutStringVar.toInt(&okNumber); if (!okNumber) runtimeVal = knc::numberVarError; } } else runtimeVal=knc::numberVarError; m_frontPanel->setRuntime(runtimeVal); if (nutStringVar.isNull()) { m_lowXfer =-1; m_highXfer=-1; m_existLowHighXfer = false; } else { m_lowXfer = nutStringVar.toDouble(); nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->highxferVar); if (nutStringVar.isEmpty()) { m_highXfer = -1; m_existLowHighXfer = false; } else { m_highXfer = nutStringVar.toDouble(); m_existLowHighXfer = true; } } m_panelMeter->deActivateAnalogs(); // pokud je pouzito XFER nastavime hodnoty // when XFER is used we set values if (m_settingData->lowHighXfer) { // xfer je nastaveno // xfer is seted if (m_existLowHighXfer) { if (abs((int)(230 - (m_lowXfer + (m_highXfer - m_lowXfer) /2))) > abs((int)(120 - (m_lowXfer + (m_highXfer - m_lowXfer) /2)))) { m_analogRecords->setVoltage(120); m_analogRecords->setFrequency(60); } else { m_analogRecords->setVoltage(230); m_analogRecords->setFrequency(50); } m_analogRecords->setXfer(m_lowXfer,m_highXfer); } } m_panelMeter->activateAnalogs(); // makes panel and makes background of panel // doesn't repaint analog pointers, because pointers will be repainted twice } else { cleanPanels(); } } void KNutMainWindow::zeroingPanels (void) { m_panelMeter->zeroingPanels(); m_frontPanel->setRuntime(knc::numberVarError); m_frontPanel->setPanel(0); } void KNutMainWindow::hideUpsData (void) { m_frontPanel->cleanPanel(); } void KNutMainWindow::setCombo (const QString &name) { if (m_upsComboBox->currentText() != name) { int i = m_upsComboBox->findText(name); if (i != -1) m_upsComboBox->setCurrentIndex(i); } } void KNutMainWindow::repaintPanel (void) { qDebug ("KNutMainWindow::repaintPanel"); QString nutStringVar; if (m_activeUpsInfo->upsNet == 0) return; if (!m_activeUpsInfo->upsNet->existName(m_activeUpsInfo->runtimeVar)) { nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->runtimeVar); if (nutStringVar.isEmpty()) m_frontPanel->setRuntime(0); else m_frontPanel->setRuntime( nutStringVar.toInt()); } else m_frontPanel->setRuntime(knc::numberVarError); // precteme status a nastavime zarovky panelu int status = m_activeUpsInfo->upsNet->readStatus(); m_frontPanel->setPanel(status); } /// je volan vzdy po timeoutu /// this function is called after timeout always void KNutMainWindow::repaintAnalogs ( void ) { qDebug("KNutMainWindow::repaintAnalogs"); QString nutStringVar; float numVar; bool newRange = false; if ((m_settingData->lowHighXfer) && (m_existLowHighXfer)) { QString nutStringVar; nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->lowxferVar); if (! nutStringVar.isEmpty()) { float helpLowXfer = nutStringVar.toFloat(); nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->highxferVar); if (! nutStringVar.isEmpty()) { float helpHighXfer = nutStringVar.toFloat(); if ((helpLowXfer != m_lowXfer) || (helpHighXfer != m_highXfer)) { m_lowXfer=helpLowXfer; m_highXfer=helpHighXfer; m_analogRecords->setXfer(m_lowXfer,m_highXfer); newRange = true; } } } } if (newRange) m_panelMeter->repaintAnalogPanels (true, true, false); for (int i=0; i< knc::NumberOfVars; i++) { //qDebug("KNutMainWindow::repaintAnalogs -- pre m_panelMeter %d %d",i,m_activeUpsInfo->record.upsVarCode[i]); if (m_activeUpsInfo->record.upsVarCode[i] != 0) { // jistota pokud by nam to nekde propadlo nutStringVar = m_activeUpsInfo->upsNet->readStringVar( KNutVarData::nameUpsVar(m_activeUpsInfo->record.upsVarCode[i],m_activeUpsInfo->nutVariables)); if (nutStringVar.isEmpty()) { numVar=0; } else { numVar = nutStringVar.toFloat(); } // changes range of panel for current ups power .... m_panelMeter->repaintScaleAnalogPanel (m_activeUpsInfo->record.upsVarCode[i], numVar); // changes range of panel for in/out frequency and voltage 50/60Hz and 120/230 V m_panelMeter->repaintAnalogPointer(m_activeUpsInfo->record.upsVarCode[i] ,numVar); } } // end for m_panelMeter->repaint(); } void KNutMainWindow::cleanPanels (void) { m_frontPanel->cleanPanel(); m_panelMeter->deActivateAnalogs(); } void KNutMainWindow::startConnectPB ( const int count ) { m_connectProggresBar->setRange(0,count); m_connectProggresBar->setValue(1); m_connectProggresBar->show(); } void KNutMainWindow::setProgressConnectPB ( const int progress ) { m_connectProggresBar->setValue(progress); } void KNutMainWindow::hideConnectPB ( void ) { m_connectProggresBar->setValue(0); m_connectProggresBar->hide(); } /*********************************************************************************************/ /* */ /* PRIVATE SLOTS */ /* */ /*********************************************************************************************/ void KNutMainWindow::slotDescription(void) { if (m_descriptionAction->isChecked()) { if (!m_activeUpsInfo->upsNet->isDescription()) m_activeUpsInfo->upsNet->getDescription(); m_settingData->useDescription=true; } else m_settingData->useDescription=false; emit saveConf(); } void KNutMainWindow::slotPrintUPSVars(void) { emit showUPSVars(); } void KNutMainWindow::slotInstComms(void) { emit makeInstComms(); } void KNutMainWindow::slotRWVars(void) { emit makeRWVars(); } void KNutMainWindow::slotRefreshConnection(void) { emit makeRefreshConnection(); } void KNutMainWindow::slotChangeRWVars ( QString ) { } void KNutMainWindow::closeEvent( QCloseEvent *e ){ m_settingData->activatedMainWindow=false; //information about state of mainWindow // e->accept(); KXmlGuiWindow::closeEvent(e); } void KNutMainWindow::slotConfigureKeys() { KShortcutsDialog::configure( actionCollection(),KShortcutsEditor::LetterShortcutsDisallowed, this ); } void KNutMainWindow::slotCloseKNutClient (void) { emit endApplication(); } void KNutMainWindow::slotChangeUPS (const QString &name) { emit UPSChanged (name); } void KNutMainWindow::slotPreferencesUps() { emit preferenceUps(); } /*********************************************************************************************/ /* */ /* PRIVATE FUNCTIONS */ /* */ /*********************************************************************************************/ void KNutMainWindow::initStatusBar ( void ) { // sets main message if statusbar // nastavime hlavni hlaseni v statusbaru // QString progressString("%v ");// += descrOfConnection; // progressString.append(descrOfConnection); m_progressFormatString.append("%v "); m_progressFormatString.append(descrOfConnection); m_infoCombo = new KComboBox (statusBar()); m_infoCombo->setMaxCount(knc::maxCountKNutEvent+1); // nastavime maximalni pocet polozek v Combu // pro rezervu pridame jeste jednu //sets maximal if items in Combo statusBar()->addWidget(m_infoCombo,10); m_connectProggresBar = new QProgressBar(statusBar()); statusBar()->addWidget(m_connectProggresBar,5); m_connectProggresBar->setValue(0); // m_connectProggresBar->setFormat("%v test of conection from 5"); m_connectProggresBar->setFormat(m_progressFormatString); m_connectProggresBar->hide(); } void KNutMainWindow::initStatusBarMessage ( void ) { // loads data into comboBox QStringList::iterator it; m_infoCombo->insertItems(m_infoCombo->count(),*m_listKNutEvent); statusBar()-> setItemAlignment(0,Qt::AlignHCenter|Qt::AlignVCenter); m_infoCombo->setCurrentIndex(m_infoCombo->count()-1); } void KNutMainWindow::initToolBarAction ( void ) { QLabel *upsNazev = new QLabel ("UPS : ",this); m_upsComboBox = new KComboBox(this); KAction *upsToolBarLabel = new KAction(i18n("UPS Label"),this); upsToolBarLabel->setDefaultWidget(upsNazev); actionCollection()->addAction("upslabel",upsToolBarLabel); KAction *upsToolBarComboBox = new KAction(i18n("UPS ComboBox"),this); upsToolBarComboBox->setDefaultWidget(m_upsComboBox); actionCollection()->addAction("upscombobox",upsToolBarComboBox); connect (m_upsComboBox,SIGNAL (activated (const QString &)),this,SLOT (slotChangeUPS (const QString &))); } void KNutMainWindow::setToolBar ( void ) { m_upsComboBox->setEditable(false); m_upsComboBox->clear(); toolBar("mainToolBar")->setAllowedAreas (Qt::TopToolBarArea); //sets toolbarr no movable / nastavime toolBar nepresouvatelny toolBar("mainToolBar")->setMovable(false); } void KNutMainWindow::initAction ( void ) { // KAction and KStdAction must be to make before command createGUI, function initToolBar is runed after create GUI m_quit = KStandardAction::quit (this, SLOT (slotCloseKNutClient()), actionCollection()); m_quit->setStatusTip(i18n("Quits the application")); m_preferencesUps = KStandardAction::preferences (this, SLOT (slotPreferencesUps()), actionCollection()); KAction *actPrintUPSVars = new KAction(KIcon("view-list-tree"),i18n("&Showing UPS variables and commands"),this); actionCollection()->addAction("printupsvars",actPrintUPSVars); connect (actPrintUPSVars, SIGNAL(triggered(bool)),this,SLOT(slotPrintUPSVars())); KAction *actInstComms= new KAction(i18n("&Running instant commands"),this); actionCollection()->addAction("instcomms",actInstComms); connect ( actInstComms,SIGNAL(triggered(bool)), this,SLOT(slotInstComms())); KAction *actRWVars = new KAction(i18n("Setting R&W variables"),this); actionCollection()->addAction("rwvars",actRWVars); connect (actRWVars, SIGNAL(triggered(bool)),this,SLOT(slotRWVars())); setStandardToolBarMenuEnabled(true); m_descriptionAction = new KToggleAction(i18n("&Using descriptions"),this); actionCollection()->addAction("use_description",m_descriptionAction); connect (m_descriptionAction, SIGNAL(triggered(bool)),this,SLOT(slotDescription())); KStandardAction::keyBindings( this, SLOT(slotConfigureKeys()),actionCollection()); KAction *actRefreshConnection = new KAction (KIcon("view-refresh"),i18n("Reconnect"),this); actionCollection()->addAction("reconnect",actRefreshConnection); connect (actRefreshConnection,SIGNAL(triggered(bool)),this,SLOT(slotRefreshConnection())); actRefreshConnection->setShortcut(Qt::Key_F5); actRefreshConnection->setStatusTip(i18n("Reconnect the application")); } void KNutMainWindow::initVars ( void ) { //m_activeUpsIndex = -1; //nastavime fonty // sets fonts m_mainPalette= kapp->palette(); //saves init system palette m_areaPalette=m_mainPalette; m_aPanelPalette=m_mainPalette; m_mPanelPalette=m_mainPalette; } void KNutMainWindow::setPalettes ( void ) { //sets palette for analog panels if (m_settingData->customBAnalogColor) { m_aPanelPalette.setColor(QPalette::Active,QPalette::Background,m_settingData->aPanelBackgroundColor); m_aPanelPalette.setColor(QPalette::Inactive,QPalette::Background,m_settingData->aPanelBackgroundColor); } //sets palette for front panel if (m_settingData->customBPanelColor) { m_mPanelPalette.setColor(QPalette::Active,QPalette::Background,m_settingData->mPanelBackgroundColor); m_mPanelPalette.setColor(QPalette::Inactive,QPalette::Background,m_settingData->mPanelBackgroundColor); } if (m_settingData->customBColor) { m_areaPalette.setColor(QPalette::Active,QPalette::Background,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Background,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Active,QPalette::Base,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Base,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Active,QPalette::Button,m_settingData->mainBackgroundColor); m_areaPalette.setColor(QPalette::Inactive,QPalette::Button,m_settingData->mainBackgroundColor); } } int KNutMainWindow::activeMainCombo (void) { int activeUpsNameIndex = -1; // zadne upsName neni aktivni , any upsName is not active // m_upsComboBox = new KComboBox; // toolBar("mainToolBar")->addWidget (m_upsComboBox); // m_upsComboBox->setVisible(true); //naplnime comboBox //loads comboBox m_upsComboBox->clear(); for (int i=0; i < m_upsRecords->getCount (); i++) { m_upsComboBox->insertItem (i,m_upsRecords->getName(i)); // ulozime si poradove cislo jmena aktivniho ups // save serial number of active usp name if ((m_upsRecords->getName(i)) == m_activeUpsInfo->record.name) activeUpsNameIndex = i; } return activeUpsNameIndex; } void KNutMainWindow::saveConfiguration ( void ) { KConfigGroup config = KGlobal::config()->group("MainWindow"); //saves info about main window config.writeEntry ("PosY",y()); // config.writeEntry ("PosX",x()); // config.sync(); } #include "knutmainwindow.moc" knc105/src/knutnewupsdlg.cpp0000644000175000017500000002221511526443102014352 0ustar dandan/*************************************************************************** knutnewupsdlg.cpp - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutnewupsdlg.h" #include #include #include #include #include #include #include #include #include //#include KNutNewUpsDlg::KNutNewUpsDlg (KNutUpsData* const upsData, KNutVarData* const analogData, const bool add, QWidget* parent) : KDialog( parent ), addMember(add), m_myUpsData(upsData) { setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Help ); setModal(true); setInitialSize(QSize(450,600)); QWidget *page = new QWidget(this); setMainWidget (page); QVBoxLayout *mainLayout = new QVBoxLayout( page ); QGroupBox *hostBox = new QGroupBox (page); QGridLayout *hostLayout = new QGridLayout (hostBox); mainLayout->addWidget(hostBox); QGroupBox* GroupBox2 = new QGroupBox(page); QVBoxLayout *vActionSelectorLayout = new QVBoxLayout( GroupBox2 ); QLabel* textLabel1 = new QLabel( i18n("Name")+":",hostBox); m_lineEdit1 = new KLineEdit( hostBox ); textLabel1->setBuddy(m_lineEdit1); m_lineEdit1->setEnabled( add ); // pokud se nejedna o pridani (add) neni jmeno aktivovano // when makes adding name isn't activated hostLayout->addWidget (textLabel1,1,0); hostLayout->addWidget (m_lineEdit1,1,1,1,3); QLabel* textLabel2 = new QLabel(i18n("UPS address")+":", hostBox ); m_lineEdit2 = new KLineEdit( hostBox ); textLabel2->setBuddy(m_lineEdit2); hostLayout->addWidget (textLabel2,2,0); hostLayout->addWidget (m_lineEdit2,2,1,1,3); // Name of UPS QLabel* textLabel7 = new QLabel(i18n("UPS name")+":", hostBox ); m_lineEdit7 = new KLineEdit( hostBox); textLabel7->setBuddy(m_lineEdit7); hostLayout->addWidget (textLabel7,3,0); hostLayout->addWidget (m_lineEdit7,3,1,1,3); QLabel* textLabel3 = new QLabel(i18n("Delay (ms):"), hostBox ); m_lineEdit3 = new KLineEdit( hostBox ); m_lineEdit3->setText("5000"); textLabel3->setBuddy(m_lineEdit3); hostLayout->addWidget (textLabel3,4,0); hostLayout->addWidget(m_lineEdit3,4,1); QLabel* textLabel4 = new QLabel(i18n("Port:"), hostBox ); m_lineEdit4 = new KLineEdit( hostBox ); m_lineEdit4->setText(QString("%1").arg(knc::DefaultPort)); textLabel4->setBuddy(m_lineEdit4); hostLayout->addWidget(textLabel4,4,2); hostLayout->addWidget(m_lineEdit4,4,3); QLabel* textLabel5 = new QLabel(i18n("User name:"), hostBox ); m_lineEdit5 = new KLineEdit( hostBox ); m_lineEdit5->setText(""); textLabel5->setBuddy(m_lineEdit5); hostLayout->addWidget (textLabel5,5,0); hostLayout->addWidget(m_lineEdit5,5,1); QLabel* textLabel6 = new QLabel(i18n("Password:"), hostBox ); m_lineEdit6 = new KLineEdit( hostBox ); m_lineEdit6->setEchoMode(QLineEdit::Password); m_lineEdit6->setText(""); textLabel6->setBuddy(m_lineEdit6); hostLayout->addWidget(textLabel6,5,2); hostLayout->addWidget(m_lineEdit6,5,3); m_savePassword = new QCheckBox (i18n("Store NUT password in configuration file"),page); mainLayout->addWidget(m_savePassword); mainLayout->addSpacing(10); mainLayout->addWidget(GroupBox2); m_upsValueSelector = new KActionSelector(GroupBox2); m_upsValueSelector->setAvailableLabel(i18n("Availabled UPS values")); m_upsValueSelector->setSelectedLabel(i18n("Selected UPS values")); m_upsValueSelector->setAvailableInsertionPolicy(KActionSelector::Sorted); m_upsValueSelector->setSelectedInsertionPolicy(KActionSelector::AtTop); vActionSelectorLayout->addWidget(m_upsValueSelector); mainLayout->addStretch(10); GroupBox2->setTitle( i18n( "UPS Variables" )); QListWidget* aListWidget = m_upsValueSelector->availableListWidget(); for (int i=1; i < knc::NumberOfTypes; i++) { //values 0 is None, this values isn't showing new KNutUpsWidgetItem (aListWidget, analogData->getNameAnalogData(i),i); } aListWidget->sortItems(Qt::AscendingOrder); } KNutNewUpsDlg::~KNutNewUpsDlg() { } void KNutNewUpsDlg::moveToSelectedList (const int codeUpsVar) { if (codeUpsVar == 0) return; if (isExistSelectedItem(codeUpsVar)) return; //Value is moved yet KNutUpsWidgetItem *availableItem = 0; for (int i = 0; i< m_upsValueSelector->availableListWidget()->count(); i++) { availableItem =(KNutUpsWidgetItem*) m_upsValueSelector->availableListWidget()->item(i); if (availableItem->getVarCode() == codeUpsVar) { QListWidget* sListWidget = m_upsValueSelector->selectedListWidget(); new KNutUpsWidgetItem (sListWidget,availableItem->text(),codeUpsVar); m_upsValueSelector->availableListWidget()->takeItem( m_upsValueSelector->availableListWidget()->row(availableItem)); break; } } } bool KNutNewUpsDlg::isExistSelectedItem (const int codeUpsVar) const { KNutUpsWidgetItem *selectedItem = 0; for ( int i = 0; i < m_upsValueSelector->selectedListWidget()->count(); i++) { selectedItem = (KNutUpsWidgetItem*) m_upsValueSelector->selectedListWidget()->item(i); if (selectedItem->getVarCode()== codeUpsVar) return true; } return false; } void KNutNewUpsDlg::putData (const KNutUpsData::upsRecordDef upsRecord ) { m_lineEdit1->setText(upsRecord.name); m_lineEdit2->setText(upsRecord.upsAddress); m_lineEdit7->setText(upsRecord.upsName); QString delay, port; delay.setNum(upsRecord.delay); m_lineEdit3->setText(delay); port.setNum(upsRecord.port); m_lineEdit4->setText(port); m_lineEdit5->setText(upsRecord.userName); m_lineEdit6->setText(upsRecord.password); m_savePassword->setChecked(m_savePassword); for (int j=0; j text(); upsRecord.upsAddress=m_lineEdit2->text(); upsRecord.upsName= m_lineEdit7->text(); upsRecord.delay=m_lineEdit3->text().toLong(); upsRecord.port=(short unsigned)m_lineEdit4->text().toUInt(); upsRecord.userName=m_lineEdit5->text(); upsRecord.password=m_lineEdit6->text(); upsRecord.savePassword=m_savePassword->isChecked(); KNutUpsWidgetItem *selectedItem; for (j = 0; j < m_upsValueSelector->selectedListWidget()->count(); j++) { selectedItem =(KNutUpsWidgetItem*)m_upsValueSelector->selectedListWidget()->item(j); upsRecord.upsVarCode[j] = selectedItem->getVarCode(); } for (int i=j; i < knc::NumberOfVars; i++) { upsRecord.upsVarCode[i]=0; } return upsRecord; } void KNutNewUpsDlg::makeOk() { bool ok; setResult(QDialog::Rejected); // closes window m_lineEdit1->setText(m_lineEdit1->text().trimmed()); m_lineEdit2->setText(m_lineEdit2->text().trimmed()); if ((m_lineEdit1->text().length() <1 ) || (m_lineEdit2->text().length() <1 )) { KMessageBox::sorry (0,i18n("No Name or UPS address")); return; } if (addMember) { // when UpsName is existed we cannot make new record // pokud UpsName jiz existuje nemuzeme vytvorit novy zaznam if ( m_myUpsData->findName(m_lineEdit1->text()) != 0L ) { KMessageBox::sorry (0,i18n("This Name exist")); return; } } long delay = m_lineEdit3->text().toLong(&ok); if (! ok) { KMessageBox::sorry (0,i18n("Delay must be number")); return; } long port = m_lineEdit4->text().toLong(&ok); if (! ok) { KMessageBox::sorry (0,i18n("Port must be number")); return; } if ((port < knc::StartPort) || (port > knc::StopPort)) { KMessageBox::sorry (0,i18n("Port must be from 1025 until 65535")); return; } if (delay < knc::MinDelay) { KMessageBox::sorry (0,i18n("Delay is too small")); return; } accept (); } /*********************************************************************************************/ /* */ /* PROTECTED SLOTS */ /* */ /*********************************************************************************************/ void KNutNewUpsDlg::slotButtonClicked(int button) { if (button == KDialog::Ok) makeOk(); else KDialog::slotButtonClicked(button); } #include "knutnewupsdlg.moc" knc105/src/knutvardata.cpp0000644000175000017500000002705011526443114013771 0ustar dandan/*************************************************************************** knutvardata.cpp - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutvardata.h" #include "knutnet.h" #include #include #include #include //#include const char *nameUpsVars1[] = { "NONE", "UTILITY", "BATTPCT", "UPSTEMP", "ACFREQ", "LOADPCT", "AMBTEMP", "AMBHUMID","BATTVOLT","OUTVOLT","CURRENT","NONE","BATT_TEMP","BATT_CURRENT","NONE","NONE"}; const char *nameUpsVars2[] = { "none", "input.voltage", "battery.charge", "ups.temperature", "input.frequency", "ups.load", "ambient.temperature", "ambient.humidity","battery.voltage","output.voltage","output.current","output.frequency","battery.temperature","battery.current","input.current","ups.power"}; /* * Nic,Vstupni Napeti,Baterie,Teplota UPSky, * Vstupni frekvence,Zatizeni,Vnejsi teplota, * Vnejsi vlhkost,Napeti baterie, Vystupni napeti * Vystupni proud, Teplota baterie, Proud baterie */ const QString KNutVarData::nameUpsVar (const int i, const KNutNet::nutVarVersion varVersion ) { if (i < 0) return ""; switch ( varVersion ) { case KNutNet::versionVarOne: return nameUpsVars1[i]; break; case KNutNet::versionVarTwo: return nameUpsVars2[i]; break; case KNutNet::versionVarUnknown: default: return ""; break; } } KNutVarData::KNutVarData(){ m_upsVarNameAnalog[0] = i18n("None"); m_upsVarNameAnalog[1] = i18n("Input Voltage"); m_upsVarNameAnalog[2] = i18n("Battery Charge"); m_upsVarNameAnalog[3] = i18n("UPS Temperature"); m_upsVarNameAnalog[4] = i18n("Input Frequency"); m_upsVarNameAnalog[5] = i18n("UPS Load"); m_upsVarNameAnalog[6] = i18n("Outside Temperature"); m_upsVarNameAnalog[7] = i18n("Outside Humidity"); m_upsVarNameAnalog[8] = i18n("Battery Voltage"); m_upsVarNameAnalog[9] = i18n("Output Voltage"); m_upsVarNameAnalog[10] = i18n("Output Current"); m_upsVarNameAnalog[11] = i18n("Output Frequency"); m_upsVarNameAnalog[12] = i18n("Battery Temperature"); m_upsVarNameAnalog[13] = i18n("Battery Current"); m_upsVarNameAnalog[14] = i18n("Input Current"); m_upsVarNameAnalog[15] = i18n("UPS Power"); static const QString upsVarNameUnit[] = {"", "V", "%", "C", "Hz", "%", "C", "%", "V", "V", "A","Hz","C", "A", "A", "VA"}; static const int upsVarType[] = {0,3,2,1,1,2,1,1,3,3,2,1,1,2,2,2}; //typ panelu static const int upsVarItem[] = {5,4,5,5,6,6,5,5,5,4,5,6,5,5,5,5}; // pocet velkych policek na stupnici static const int upsVarInItem[] = {0,3,0,0,4,0,0,0,0,3,5,4,0,5,5,5}; // pocet malych policek ve velkem policku na stupnici static const int upsVarStart[] = {0,170,0,-10,20,0,-10,0,0,170,0,20,-10,-15,-15,0}; static const int upsVarEnd[] = {0,290,100,90,80,120,70,100,10,290,5,80,90,10,10,500}; static const int upsVarScaleStart[ knc::NumberOfTypes ][5] = {{0,0,0,0,0},{0,210,0,0,0},{50,0,40,0,0},{-100,50,0,0,0},{0,40,45,0,0},{0,80,100,0,0},{-100,50,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{210,0,250,0,0},{0,0,0,0,0},{0,40,45,0,0},{-100,50,0,0,0},{0,0,0,0,0}, {0,0,0,0,0},{0,0,0,0,0}}; static const int upsVarScaleEnd[ knc::NumberOfTypes ][5] = {{0,0,0,0,0},{400,250,0,0,0},{120,40,50,0,0},{50,100,0,0,0},{90,60,55,0,0},{80,100,120,0,0},{50,70,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{250,210,400,0,0},{0,0,0,0,0},{90,60,55,0,0},{50,100,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}; int upsVarScaleColor[ knc::NumberOfTypes ][5] = {{aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}, {aRegRed,aRegGreen,aRegWhite,aRegWhite,aRegWhite}, {aRegGreen,aRegRed,aRegYellow,aRegWhite,aRegWhite}, {aRegGreen,aRegRed,aRegWhite,aRegWhite,aRegWhite}, {aRegRed,aRegYellow,aRegGreen,aRegWhite,aRegWhite}, {aRegGreen,aRegYellow,aRegRed,aRegWhite,aRegWhite}, {aRegGreen,aRegRed,aRegWhite,aRegWhite,aRegWhite}, {aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}, {aRegGreen,aRegRed,aRegRed,aRegWhite,aRegWhite}, {aRegGreen,aRegRed,aRegRed,aRegWhite,aRegWhite}, {aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}, {aRegRed,aRegYellow,aRegGreen,aRegWhite,aRegWhite}, {aRegGreen,aRegRed,aRegWhite,aRegWhite,aRegWhite}, {aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}, {aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite}, {aRegWhite,aRegWhite,aRegWhite,aRegWhite,aRegWhite},}; for (int i=0;i < knc::NumberOfTypes; i++) { m_dataVar[i].nameAnalog = m_upsVarNameAnalog[i]; m_dataVar[i].nameUnit = upsVarNameUnit[i]; m_dataVar[i].typeAnalog = upsVarType[i]; m_dataVar[i].numberItem = upsVarItem[i]; m_dataVar[i].numberInItem = upsVarInItem[i]; m_dataVar[i].start = upsVarStart[i]; m_dataVar[i].end = upsVarEnd[i]; for (int j=0; j< 5; j++) { m_dataVar[i].scaleStruct[j].start=upsVarScaleStart[i][j]; m_dataVar[i].scaleStruct[j].end=upsVarScaleEnd[i][j]; m_dataVar[i].scaleStruct[j].scaleColor=upsVarScaleColor[i][j]; } } m_dataVarVoltage[U230V]=m_dataVar[knc::VarInVolt]; m_dataVarVoltage[U120V]=m_dataVar[knc::VarInVolt]; m_dataVarVoltage[U120V].start=90; m_dataVarVoltage[U120V].end=150; m_dataVarVoltage[U120V].scaleStruct[0].start=0; m_dataVarVoltage[U120V].scaleStruct[1].start=110; m_dataVarVoltage[U120V].scaleStruct[0].end=200; m_dataVarVoltage[U120V].scaleStruct[1].end=130; m_dataVarFrequence[F50HZ]=m_dataVar[knc::VarInFreq]; m_dataVarFrequence[F60HZ]=m_dataVar[knc::VarInFreq]; m_dataVarFrequence[F60HZ].start=30; m_dataVarFrequence[F60HZ].end=90; m_dataVarFrequence[F60HZ].scaleStruct[0].start=0; m_dataVarFrequence[F60HZ].scaleStruct[1].start=50; m_dataVarFrequence[F60HZ].scaleStruct[2].start=55; m_dataVarFrequence[F60HZ].scaleStruct[0].end=100; m_dataVarFrequence[F60HZ].scaleStruct[1].end=70; m_dataVarFrequence[F60HZ].scaleStruct[2].end=65; } KNutVarData::~KNutVarData(){ } KNutVarData::VarStrucDef KNutVarData::getData (const int seqNumber) const { int i = seqNumber; if (i < 1) i = 1; else {if (i > (knc::NumberOfTypes-1)) i = knc::NumberOfTypes - 1;}; return m_dataVar[i]; } QString KNutVarData::getNameAnalogData (const int seqNumber) { if ((seqNumber >= 0) && (seqNumber < knc::NumberOfTypes)) return m_upsVarNameAnalog[seqNumber]; else return ""; } void KNutVarData::putData (const int seqNumber, VarStrucDef& varStruc) { if (seqNumber > 0 && seqNumber < knc::NumberOfTypes) m_dataVar[seqNumber] = varStruc; } void KNutVarData::setVoltage (const int typeVoltage) { if (typeVoltage == 230) { m_dataVar[knc::VarInVolt] = m_dataVarVoltage[U230V]; m_dataVar[knc::VarOutVolt] = m_dataVarVoltage[U230V]; // m_dataVar[knc::VarOutVolt].nameAnalog = upsVarNameAnalog[knc::VarOutVolt]; // je nutno nastavit nazev } if (typeVoltage == 120) { m_dataVar[knc::VarInVolt] = m_dataVarVoltage[U120V]; m_dataVar[knc::VarOutVolt] = m_dataVarVoltage[U120V]; // dataVar[knc::VarOutVolt].nameAnalog = upsVarNameAnalog[knc::VarOutVolt]; // je nutno nastavit nazev } m_dataVar[knc::VarOutVolt].nameAnalog = m_upsVarNameAnalog[knc::VarOutVolt]; // je nutno nastavit nazev } void KNutVarData::setFrequency (const int typeFrequence) { if (typeFrequence == 50) { m_dataVar[knc::VarInFreq] = m_dataVarFrequence[F50HZ]; m_dataVar[knc::VarOutFreq] = m_dataVarFrequence[F50HZ]; } if (typeFrequence == 60) { m_dataVar[knc::VarInFreq] = m_dataVarFrequence[F60HZ]; m_dataVar[knc::VarOutFreq] = m_dataVarFrequence[F60HZ]; } m_dataVar[knc::VarOutFreq].nameAnalog = m_upsVarNameAnalog[knc::VarOutFreq]; // je nutno nastavit nazev } void KNutVarData::setXfer (const float lowXfer, const float highXfer) { m_dataVar[knc::VarInVolt].scaleStruct[1].start=(int)lowXfer; m_dataVar[knc::VarInVolt].scaleStruct[1].end=(int)highXfer; m_dataVar[knc::VarOutVolt].scaleStruct[1].start=(int)lowXfer; m_dataVar[knc::VarOutVolt].scaleStruct[1].end=(int)highXfer; } const QString KNutVarData::errorToText (const int error) { switch (error) { // knutclient error case KNutNet::LowMem: return i18n("No memory."); case KNutNet::NullAddress: return i18n("No address."); case KNutNet::NoSuchHost: return i18n("Unknown address."); case KNutNet::SocketReadErr: // socket case KNutNet::ConnectErr: // connect return i18n("Error of connection."); case KNutNet::NetworkError: return i18n("Network error, maybe net cable was plugged out."); case KNutNet::CantConnect: return i18n("No connection with server."); case KNutNet::NutProtocolVarErr: return i18n("Server-client protocol or variables of NUT are unknown."); case KNutNet::NoUpsHere: return i18n("No UPS on this address."); case KNutNet::ConnectionRefused: return i18n("Connection was refused by server."); case KNutNet::SendErr: return i18n("Server doesn't receive data."); case KNutNet::RecvErr: return i18n("Server doesn't send data."); case KNutNet::NoServerData: return i18n("Server doesn't answer."); case KNutNet::UnknownFormat: return i18n("Server returns data with unknown format."); case KNutNet::UnknownAnswer: return i18n("Server returns unknown data."); case KNutNet::UnknownFormatVer: return i18n("Command VER returns data with unknown format."); case KNutNet::NoData: return i18n("No data."); case KNutNet::NotConnection: return i18n("Connection doesn't exist."); // server error case KNutNet::AccessDenied: return i18n("Access denied. Failed password ?"); case KNutNet::DataStale: return i18n("UPS doesn't sent data to server (Data Stale)."); case KNutNet::UnknownCommand: return i18n("Server doesn't know this command."); // driver error case KNutNet::DriverNotConnected: return i18n("UPS's driver isn't connected."); case KNutNet::PasswordRequired: return i18n("Server required password."); case KNutNet::PasswordIncorrect: return i18n("Incorrect password."); case KNutNet::NoResponse: return i18n("UPS doesn't response."); case KNutNet::CommandFailed: return i18n("Command failed."); case KNutNet::UnknownInstCmd: return i18n("UPS doesn't know this instant command."); case KNutNet::CmdNotSupported: return i18n("UPS doesn't support this instant command."); case KNutNet::VarUnknown: return i18n("UPS doesn't known this variable."); case KNutNet::VarNotSupported: return i18n("UPS doesn't support this variable."); case KNutNet::InvalidValue: return i18n("UPS doesn't support this value in this variable."); case KNutNet::UnknownUps: return i18n("Name of UPS is unknown."); case KNutNet::AlreadySetUsername: return i18n("Username has been already entered."); case KNutNet::AlreadySetPassword: return i18n("Password has been already entered."); case KNutNet::NoListVars: return i18n("Server doesn't send list of variables."); //default default: return i18n("Unknown error."); } } knc105/src/knutmainwindow.h0000644000175000017500000002243511436653645014206 0ustar dandan/*************************************************************************** knutmainwindow.h - description ------------------- begin : Po cen 16 2003 copyright : (C) 2003 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTMAINWINDOW_H #define KNUTMAINWINDOW_H #ifdef HAVE_CONFIG_H #include #endif #include "knutprefdlg.h" #include "knutupsdata.h" #include "knutvardata.h" #include "knutfrontpanel.h" #include "knutnet.h" #include "knutanalog.h" #include "knutpanelmeter.h" #include #include #include #include class QWidget; class QString; class QStringList; class QPalette; class QSplitter; class QProgressBar; /** * Trida slouzi pro zobrazeni okna s informacemi o UPS. * Class is used for view window with informations about UPS * * @author Daniel Prynych * @short Hlavni okno * @version 0.2.3 */ class KNutMainWindow : public KXmlGuiWindow { Q_OBJECT public: /** * Constructor - makes main window. * Konstruktor - vytvori hlavni okno. * * @param tListKNutEvent pointer on QStringList contain text information about events (drop connection, switch ..) * @param tActiveUpsInfo pointer on data about active UPS * @param tSettingData pointer on basic data of program (background color, intercircle, pointers...,fonts..) * @param tAnalogRecords pointer in class which works with data about UPS * @param tListKNutEvent ukazatel na QStringList obsahuje textove udaje o udalostech (ztrata spojeni, prepnuti atd.) * @param tActiveUpsInfo ukazatel na data o aktivni UPS * @param tSettingData ukazatel na zakladni data programu (barvy pozadi, mezikruzi, rucicky ... ,fonty atd ) * @param tAnalogRecords ukazatel na tridu ktera pracuje s daty o upsekach * * @since 0.3.1 **/ KNutMainWindow(QStringList* tListKNutEvent, KNutVarData::upsInfoDef* tActiveUpsInfo, KNutVarData::SettingDataDef* tSettingData, KNutUpsData* tUpsRecords, KNutVarData* tAnalogRecords, QWidget* parent=0); /** * Destructor * * @since 0.1.1 **/ ~KNutMainWindow(); /** * Repaints information of main panel. * Prekresli informace hlavniho panelu. * * @since 0.1.2 **/ void repaintPanel(void); /** * Repaints analog panels based on their status. * Prekresli analogove panely na zaklade jejich stavu. * immediately repaint of panel * * @since 0.3.1 **/ void repaintAnalogs ( void ); /** * Da prikaz k prekresleni analogovych panelu, hlavniho panelu a nastavi jejich hodnoty na * zaklade XFer hodnot. * Give command to repaint analog panels, main panel and sets their values based on XFer values * @param run = TRUE makes immediately repaint of analog panels * * @since 0.3.1 **/ void showUpsData (void); /** * Adds other line into list of events and shows them on bottom part of panel. * Prida dalsi radku do seznamu udalosti a zobrazi je v dolni casti panelu. * * @param text text of event. * @param text udava text udalosti. * * @since 0.1 **/ void addComboStatusItem (const QString &text); /** * Rebuilds main panel based on value changeSetting. * This value generates config windies * Prestavi hlavni panel na zaklade hodnoty changeSetting. * Tuto hodnotu generuje konfiguracni okno. * * @param changeSetting tell which setting was changed. * @param changeSetting udava jake nastaveni bylo zmeneno. * * @since 0.1.2 **/ void setConfig (unsigned int changeSetting); /** * Sets ComboBox (for name of UPS) * Nastavi ComboBox (pro jmeno UPSky). * * ¶m name je jmeno UPSky ktere bude nastavena. * ¶m name is name of ups which will be set. * * @since 0.1 **/ void setCombo(const QString &name); /** * Nastavi vsechny panely na nulovo hodnotu * Sets all pannels to zero value * * @since 0.2 **/ void zeroingPanels (void); /** * Cleans front panel and panel meter (includes analog panels) . * * @since 0.1 **/ void cleanPanels (void); /** * Sets and shows connect progress bar. * Nastavi a zobrazi connect progress bar. * * ¶m is count of parts of progress bar. * ¶m je pocet casti progres baru. * * @since 0.1 **/ void startConnectPB ( const int count ); /** * Hide connect progress bar. * Schova connect progress bar. * * @since 0.1 **/ void hideConnectPB ( void ); /** * Sets amount of progress for connect progress bar. * Nastavi delku vyplne pro connect progresbar. * * ¶m is amount of progress. * ¶m je delka vyplne. * * @since 0.1 **/ void setProgressConnectPB ( const int progress ); signals: /** * This signal is emited when other UPS was selected. * Tento signal je vyslan pokud byla vybrana jina UPS-ka. * * @since 0.1 **/ void UPSChanged (QString); /** * This signal is emited when request for viewing preferences window was ordered from menu. * Tento signal je vyslan pokud byl z menu zadan pozadavek na zobrazeni okna * pro nastaveni programu (preference). * * @since 0.1 **/ void preferenceUps (void); /** * This signal is emited, when in menu was odered requirement for viewing list of values . * Tento signal je vyslan, pokud byl z menu zadan pozadavek na zobrazeni seznamu promennych. * * @since 0.1 **/ void showUPSVars (void); /** * Tento signal je vyslan pokud byl z menu zadan pozadavek na zmenu RW promennych. * This signal is emited when request for change RW varianles was orederd from menu. * * @since 0.1 **/ void makeRWVars(void); /** * Tento signal je vyslan pokud byl z menu vybran pozadavek na obnovu spojeni. * This signal is emited when request for refreshing connection was selected from menu. * * @since 0.1 **/ void makeRefreshConnection(void); /** * This signal is emited when request for making instant commands was selected from menu. * Tento signal je vyslan pokud byl z menu zadan pozadavek na provedeni okamzitych prikazu. * * @since 0.1 **/ void makeInstComms(void); /** * This signal is emited whem we need save configuration of program. * Tento signal je vyslan pokud potrebujeme ulozit konfiguraci programu. * * @since 0.1 **/ void saveConf(void); /** * This signal is emited whem request for ending all application was selected from menu. * Tento signal je vyslan pokud byl z menu zadan pozadavek na ukonceni cele aplikace. * * @since 0.1 **/ void endApplication(); protected: void closeEvent( QCloseEvent *e ); private slots: void slotDescription(void); void slotPreferencesUps(void); void slotPrintUPSVars(void); void slotInstComms(void); void slotRWVars(void); void slotChangeRWVars ( QString ); void slotCloseKNutClient (void); void slotChangeUPS (const QString &name); void slotConfigureKeys(void); void slotRefreshConnection(void); /************** private common functions ************************/ private: void setPalettes (void); void activeconfiguration (void); int activeMainCombo (void); void hideUpsData (void); void setToolBar (void); void saveConfiguration ( void ); /************ init functions ********************/ void initVars ( void ); void initAction ( void ); void initStatusBar ( void ); void initToolBarAction ( void ); void initStatusBarMessage ( void ); /************** private vars **************************/ // Nazvy promenych UPS cislovany jsou od 0 do 10 "NONE", "UTILITY", "BATTPCT", "UPSTEMP", "ACFREQ", "LOADPCT", "AMBTEMP", "AMBHUMID", "BATTVOLT", "OUTVOLT", "CURRENT" QStringList* m_listKNutEvent; KNutVarData::upsInfoDef* m_activeUpsInfo; // values for selected ups / hodnoty pro vybrane ups KNutVarData::SettingDataDef* m_settingData; // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci KNutUpsData* m_upsRecords; KNutVarData* m_analogRecords; KAction *m_quit; KAction *m_preferencesUps; KToggleAction *m_descriptionAction; QWidget *m_mainArea; // main arrea, on its will server main panel and analog panels // hlavni plocha na ni umistime panel a analogove ukazatele QSplitter* m_mainSplitter; KNutFrontPanel* m_frontPanel; // nactene hodnoty promenych UPS, tyto promene se ctou jen jednou // readly values of UPS's variables, these varieables is read only once QString m_manufacturer; QString m_upsModel; QString m_serial; QString m_firmrev; bool m_existLowHighXfer; double m_lowXfer, m_highXfer; QPalette m_mainPalette, m_areaPalette, m_mPanelPalette, m_aPanelPalette; // Combo a pomocne struktury pro dolni radku // Combo and help structures for bottom line. KComboBox *m_infoCombo; KComboBox *m_upsComboBox; KNutPanelMeter* m_panelMeter; QProgressBar* m_connectProggresBar; QString m_progressFormatString; }; #endif knc105/src/knutpanelmeter.cpp0000644000175000017500000003646111436653645014525 0ustar dandan/*************************************************************************** knutpanelmeter.cpp - description ------------------- begin : t b?e 16 2004 copyright : (C) 2004 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutpanelmeter.h" #include #include #include #include #include #include //#include KNutPanelMeter::KNutPanelMeter(QPalette aPanelPalette, KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutVarData* analogRecords, QWidget *parent) : QWidget(parent), m_settingData(settingData), m_activeUpsInfo(activeUpsInfo), m_analogRecords(analogRecords), m_aPanelPalette(aPanelPalette) { setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Preferred); m_analogPanels.clear(); m_widthArea =0; m_heightArea =0; } KNutPanelMeter::~KNutPanelMeter(){ deActivateAnalogs(); } void KNutPanelMeter::deActivateAnalogs (void) { qDebug("KNutPanelMeter::deActivateAnalogs"); analogPanelsList::const_iterator itc; for (itc = m_analogPanels.begin(); itc < m_analogPanels.end(); itc++) { if ( (*itc).upsAnalogs != 0) { (*itc).upsAnalogs->hide(); // hides analogMeter delete (*itc).upsAnalogs; // deletes analogMeter } } m_analogPanels.clear(); setSize(); } void KNutPanelMeter::activateAnalogs (void) { qDebug ("KNutPanelMeter::activateAnalogs"); KNutVarData::VarStrucDef analogMemberData; // deletes variables which ups doesn't support // vyjmeme promene ktere ups nepodporuje int ii =0; for (int i=0; i< knc::NumberOfVars; i++) { // otestujeme zda dane UPS podporuje tuto promenou // pokud existuje vrati 1 // moves free records // is null/ to end if (!m_activeUpsInfo->upsNet->existName(KNutVarData::nameUpsVar (m_activeUpsInfo->record.upsVarCode[i],m_activeUpsInfo->nutVariables))) { m_activeUpsInfo->record.upsVarCode[ii++] = m_activeUpsInfo->record.upsVarCode[i]; } } for (int i=ii; i< knc::NumberOfVars; i++) m_activeUpsInfo->record.upsVarCode[i]=0;// doplnime zbytek nulami to znamena zadna promena for (int i=0; i< knc::NumberOfVars; i++) { if (m_activeUpsInfo->record.upsVarCode[i] != 0) { analogPanelRecordDef analogPanelRecord; analogMemberData=m_analogRecords->getData (m_activeUpsInfo->record.upsVarCode[i]); analogPanelRecord.upsVarCode = m_activeUpsInfo->record.upsVarCode[i]; analogPanelRecord.scaleEnd=analogMemberData.end; analogPanelRecord.scaleStart=analogMemberData.start; QColor analogFingerColor, analogScaleColor, analogFontColor; if (m_settingData->customOAnalogColor) { analogFingerColor = m_settingData->analogFingerColor; analogScaleColor = m_settingData->analogScaleColor; analogFontColor = m_settingData->analogFontColor; } else { analogFingerColor = knc::defaultFingerColor; analogScaleColor = knc::defaultScaleColor; analogFontColor = knc::defaultFontColor; } //sets font QFont analogFont; if (m_settingData->customFont) { analogFont = m_settingData->aPanelFont; } else { analogFont = m_settingData->systemFont; } // doesn't make background analogPanelRecord.upsAnalogs = new KNutAnalog( this,analogMemberData.start,analogMemberData.end,analogMemberData.typeAnalog,analogMemberData.numberItem,analogMemberData.numberInItem,analogFingerColor,analogScaleColor,analogFontColor,&(analogFont),m_settingData->typeDigitalProcessing); //nastavime barvu mezikruzi if (m_settingData->customOAnalogColor) { analogPanelRecord.upsAnalogs->setArcColor(1,m_settingData->analogOKColor); // doesn't make background analogPanelRecord.upsAnalogs->setArcColor(2,m_settingData->analogWarnningColor); // doesn't make background analogPanelRecord.upsAnalogs->setArcColor(3,m_settingData->analogErrorColor); // doesn't make background } // po vygenerovani panelu jsou standartni barvy nastaveny automaticky //nastavime mezikruzi for (int j = 0; j < 5; j++ ) { if (!((analogMemberData.scaleStruct[j].start == 0) && (analogMemberData.scaleStruct[j].end ==0 ))) { analogPanelRecord.upsAnalogs->addArc (analogMemberData.scaleStruct[j].start,analogMemberData.scaleStruct[j].end,analogMemberData.scaleStruct[j].scaleColor); // doesn't make background } } analogPanelRecord.upsAnalogs->setText(analogMemberData.nameAnalog,analogMemberData.nameUnit); analogPanelRecord.upsAnalogs->setPalette(m_aPanelPalette); analogPanelRecord.upsAnalogs->makeBackground(false); // makes background of analog panel analogPanelRecord.upsAnalogs->repaintPointer(); moveUpsAnalog (i, analogPanelRecord.upsAnalogs); analogPanelRecord.upsAnalogs->show(); //repaintPointer makes all picture of analog panel asembles background with pointer and makes antialiasing m_analogPanels.push_back(analogPanelRecord); } } setSize(); } void KNutPanelMeter::moveUpsAnalog (const int i, KNutAnalog *upsAnalog) { qDebug("void KNutPanelMeter::moveUpsAnalog "); int y = (i/m_settingData->countCols); int x = i - y * m_settingData->countCols; x = x *(KNutAnalog::AnalogWidth+spacePanels) +spacePanels; y = y * (KNutAnalog::AnalogWidth+spacePanels) + spacePanels; upsAnalog->move(x,y); } void KNutPanelMeter::setSize (void) { qDebug("KNutPanelMeter::setSize"); int x =0; int y =0; if (m_analogPanels.count() != 0) { y = ((m_analogPanels.count()-1)/m_settingData->countCols)+1; if (m_analogPanels.count() > m_settingData->countCols) { x = m_settingData->countCols;} else { x = m_analogPanels.count(); } m_widthArea = x *(KNutAnalog::AnalogWidth+spacePanels) +spacePanels; m_heightArea = y * (KNutAnalog::AnalogWidth+spacePanels) + spacePanels; } else { m_widthArea = 0; m_heightArea = 0; } setMinimumSize (m_widthArea,m_heightArea); setMaximumWidth (m_widthArea); adjustSize(); repaint(); } void KNutPanelMeter::repaintScaleAnalogPanel (int upsVarCode, float value) { qDebug("KNutPanelMeter::repaintScaleAnalogPanel"); bool scaleChanged = false; analogPanelsList::iterator it; for (it = m_analogPanels.begin(); it < m_analogPanels.end(); it++) { if ((*it).upsAnalogs != 0){ if ( (*it).upsVarCode == upsVarCode) { switch ((*it).upsVarCode) { case knc::VarOutCurrent : // output.current if ((*it).scaleEnd < maxCurrent) { // max. measured value for analog pointer if ((*it).scaleEnd < value) { (*it).scaleEnd=(static_cast(floor((value+1)/5)))*5 +5; if ((*it).scaleEnd > maxCurrent) (*it).scaleEnd=maxCurrent; (*it).upsAnalogs->setRange((*it).scaleStart,(*it).scaleEnd,true); scaleChanged = true; } } break; // end VarOutCurrent case knc::VarInCurrent : // input.current if ((*it).scaleEnd < maxCurrent) { // max. measured value for analog pointer if ((*it).scaleEnd < value) { (*it).scaleEnd=(static_cast(floor((value+1)/5)))*5 +5; if ((*it).scaleEnd > maxCurrent) (*it).scaleEnd=maxCurrent; (*it).upsAnalogs->setRange((*it).scaleStart,(*it).scaleEnd,true); scaleChanged = true; } } break; // end VarIntCurrent case knc::VarUpsPower : // ups.power if ((*it).scaleEnd < maxUpsPower) { /// max. measured value for analog pointer if ((*it).scaleEnd < value) { (*it).scaleEnd = (trunc(value/500)+1)*500; if ((*it).scaleEnd > maxUpsPower) (*it).scaleEnd = maxUpsPower; (*it).upsAnalogs->setRange((*it).scaleStart,(*it).scaleEnd,true); scaleChanged = true; } } break; // end VarUpsPower case knc::VarBattVolt : // battery.voltage if ((*it).scaleEnd < maxBattVolt) { if ((*it).scaleEnd < value) { (*it).scaleEnd=(static_cast(floor((value+1)/10)))*10 +10; if ((*it).scaleEnd > maxBattVolt) (*it).scaleEnd=maxBattVolt; (*it).upsAnalogs->setRange((*it).scaleStart,(*it).scaleEnd,true); scaleChanged = true; } } break; case knc::VarBattCurrent : // battery.current if (((*it).scaleEnd < maxBattCurrent) && ((*it).scaleStart > minBattCurrent)) { if (((*it).scaleEnd < value) || ((*it).scaleStart > value)) { if ((value >10) || (value <- 15)) { if ((value >20) || (value < -30)) { if ((value >30) || (value < -45)) { if ((value >100) || (value < -150)) { (*it).scaleEnd=200; (*it).scaleStart=-300; } else { (*it).scaleEnd=100; (*it).scaleStart=-150; } } else { (*it).scaleEnd=30; (*it).scaleStart=-45; } } else { (*it).scaleEnd=20; (*it).scaleStart=-30; } } (*it).upsAnalogs->setRange ((*it).scaleStart,(*it).scaleEnd); scaleChanged = true; } } break; } // switch if (scaleChanged) { // (*it).upsAnalogs->hide();// schovame analogovy panel hides analog panel (*it).upsAnalogs->setPointer(value); // jistota pokud by nam to nekde propadlo // (*it).upsAnalogs->show(); //zobrazime merak shows analog panel (*it).upsAnalogs->repaint(); // prekreslime , repaints panel } } // panelNumber } //analog } // for it } void KNutPanelMeter::repaintAnalogPointer (const int upsVarCode, const float value) { qDebug("KNutPanelMeter::repaintAnalogPointer"); analogPanelsList::const_iterator itc; for (itc = m_analogPanels.begin(); itc < m_analogPanels.end(); itc++) { if ((*itc).upsVarCode == upsVarCode) { if ((*itc).upsAnalogs != NULL) { (*itc).upsAnalogs->setPointer (value); // nastavi hodnotu rucicky (*itc).upsAnalogs->repaint(); } } } } void KNutPanelMeter::setAnalogBG(const QPalette &aPanelPalette) { m_aPanelPalette = aPanelPalette; analogPanelsList::iterator it; for (it = m_analogPanels.begin(); it < m_analogPanels.end(); it++) { if ((*it).upsAnalogs) (*it).upsAnalogs->setPalette(m_aPanelPalette); } } void KNutPanelMeter::changeAnalogPanelsDigProcessing (void) { analogPanelsList::iterator it; for (it = m_analogPanels.begin(); it < m_analogPanels.end(); it++) { if ((*it).upsAnalogs != 0L) (*it).upsAnalogs->setDigitalProcesing(m_settingData->typeDigitalProcessing,true); } } void KNutPanelMeter::repaintAnalogPanels (const bool repaintRangeFrequencyPanels, const bool repaintRangeVoltagePanels, const bool repaintAllPanels) { qDebug ("KNutPanelMeter::repaintAnalogPanels"); KNutVarData::VarStrucDef analogMemberData; // pregenerovani panelu slouzi pro settingMain a setting Analog analogPanelsList::iterator it; for (it = m_analogPanels.begin(); it < m_analogPanels.end(); it++) { if ((*it).upsAnalogs != 0) { //if upsAnalogs[x] is set to zero, this upsAnalog is not used // record.upsVarCode contain list of code of analog meter // 0 is code for none analog meter, 1 for Input Voltage, 2 for Battery Charge, if ((((*it).upsVarCode == knc::VarInFreq) && (repaintRangeFrequencyPanels)) || (((*it).upsVarCode == knc::VarOutFreq) && (repaintRangeFrequencyPanels)) || ((((*it).upsVarCode == knc::VarInVolt) || ((*it).upsVarCode == knc::VarOutVolt)) && (repaintRangeVoltagePanels))) { analogMemberData=m_analogRecords->getData ((*it).upsVarCode); // nacteme data (*it).upsAnalogs->hide();// schovame analogovy panel (*it).upsAnalogs->delArc(); //zrusime segmenty (*it).upsAnalogs->setRange (analogMemberData.start,analogMemberData.end,false); for (int j = 0; j < 5; j++ ) { if (!((analogMemberData.scaleStruct[j].start == 0) && (analogMemberData.scaleStruct[j].end ==0 ))) { (*it).upsAnalogs->addArc (analogMemberData.scaleStruct[j].start,analogMemberData.scaleStruct[j].end,analogMemberData.scaleStruct[j].scaleColor); } // end if (! }// end for (int i=0 (*it).upsAnalogs->makeBackground(true); // repaints analog meter (*it).upsAnalogs->repaintPointer(); // repaints analog meter (*it).upsAnalogs->repaint(); // repaints analog meter (*it).upsAnalogs->show(); // shows analog meter } // end if (((activeUpsInfo if (repaintAllPanels) { if (m_settingData->customOAnalogColor) { (*it).upsAnalogs->setPointerColor(m_settingData->analogFingerColor); (*it).upsAnalogs->setArcColor(1,m_settingData->analogOKColor); (*it).upsAnalogs->setArcColor(2,m_settingData->analogWarnningColor); (*it).upsAnalogs->setArcColor(3,m_settingData->analogErrorColor); (*it).upsAnalogs->setScaleColor(m_settingData->analogScaleColor); (*it).upsAnalogs->setFontColor(m_settingData->analogFontColor); } else { (*it).upsAnalogs->setPointerColor (knc::defaultFingerColor); (*it).upsAnalogs->setDefaultArcColor(); (*it).upsAnalogs->setScaleColor (knc::defaultScaleColor); (*it).upsAnalogs->setFontColor (knc::defaultFontColor); } (*it).upsAnalogs->repaintAll(); } } } // end for setSize(); } void KNutPanelMeter::zeroingPanels (void) { qDebug("KNutPanelMeter::zeroingPanel"); analogPanelsList::iterator it; for (it = m_analogPanels.begin(); it < m_analogPanels.end(); it++) { if ((*it).upsAnalogs != NULL) { // jistota pokud by nam to nekde propadlo (*it).upsAnalogs->setPointer(0); // nastavi hodnotu rucicky (*it).upsAnalogs->repaint(); } } } QSize KNutPanelMeter::sizeHint (void) const { return QSize(m_widthArea,m_heightArea); } void KNutPanelMeter::slotSetPanelsFont(const QFont &newFont) { analogPanelsList::iterator it; for (it = m_analogPanels.begin(); it < m_analogPanels.end(); it++) { if ((*it).upsAnalogs) { (*it).upsAnalogs->slotSetAllFont(newFont); // je nutno prekresli i rucicku } } } #include "knutpanelmeter.moc" knc105/src/knutupsdata.cpp0000644000175000017500000000466511436653645014033 0ustar dandan/*************************************************************************** knutupsdata.cpp - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutupsdata.h" #include KNutUpsData::KNutUpsData() { // vytvori seznam UPS m_listRecords.clear(); m_countUpsRecords = 0; } KNutUpsData::~KNutUpsData() { m_listRecords.clear(); } void KNutUpsData::add (const upsRecordDef upsRecord) { // vlozime ups na konec m_countUpsRecords++; m_listRecords.append(upsRecord); } void KNutUpsData::put (const int index, const upsRecordDef upsRecord ) { if ((index > -1 ) && (index < m_countUpsRecords)) { m_listRecords[index] = (upsRecord); } } void KNutUpsData::get (const int index, upsRecordDef& upsRecord ) { if ((index > -1 ) && (index < m_countUpsRecords)) upsRecord=m_listRecords[index]; } QString KNutUpsData::getName (const int index) { if ((index > -1 ) && (index < m_countUpsRecords)) return m_listRecords[index].name; else return 0L; } void KNutUpsData::deleteName (const int index) { if ((index > -1 ) && (index < m_countUpsRecords)) { QList::Iterator it = m_listRecords.begin(); for (int i =0; i < index; i++) it++; m_listRecords.erase(it); m_countUpsRecords--; } } int KNutUpsData::getCount ( void ) { return m_countUpsRecords; } KNutUpsData::upsRecordDef* KNutUpsData::findName (const QString name) { QList::Iterator it; for (it = m_listRecords.begin(); it != m_listRecords.end(); it++) { if ((*it).name == name) { return &(*it); // vratime adresu } } return 0l; } knc105/src/knutnewupsdlg.h0000644000175000017500000001155511436653645014043 0ustar dandan/*************************************************************************** knutnewupsdlg.h - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTNEWUPSDLG_H #define KNUTNEWUPSDLG_H #include "knutupsdata.h" #include "knutvardata.h" #include #include #include #include #include #include #include class QLabel; class QGroupBox; class QButtonGroup; class QCheckBox; /** * This class is dialog for makeing or correcting informations about UPS. * It can set address, port and selects variable its value will be found, * Tato trida je dialog pro vytvoreni nebo opravu informaci a UPS. * Umoznuje nastavit adresu, port, a vybrat promennou jejiz hodnota se bude zjistovat. * @author Daniel Prynych * @short Panel for setting parameters of UPS * * @version 0.4 */ class KNutNewUpsDlg : public KDialog { Q_OBJECT public: /** * Constructor - makes configure dialog. * Konstruktor - vytvori konfiguracni dialog. * * @param settingData pointer on structure, which includes values which is setted in dialog. * @param upsdata is pointer on instance of class KNutUpsData. * @param analogData is pointer on instance of class KNutVardata * @param add Urcuje zda budeme data opravovat nebo pridavat. * @param settingData Je odkaz na strukturu ktera obsahuje hodnoty nastavovane v dialogu. * @param upsData Je odkaz na na instanci tridy KNutUpsData. * @param analogData Je odkaz na na instanci tridy KNutVarData. * * @since 0.8 **/ KNutNewUpsDlg (KNutUpsData* const upsData, KNutVarData* const analogData, const bool add = TRUE, QWidget* parent = 0); /** * @since 0.4 **/ ~KNutNewUpsDlg(); /** * Reads data from items of form. * Precte data z polozek formulare. * * @param upRecordDef Struktura of UpsInfo - contains all items which is included in form. * @param upsRecordDef Struktura UpsInfo - obsahuje vsechny polozky ktere jsou ve formulari. * * @since 0.5 **/ KNutUpsData::upsRecordDef getData (void ) const; /** * Puts date into intems of form * Vlozi data do polozek formulare. * * @param upsRecord Struktura of upsRecordDef - contains all items which is included in form. * @param upsRecord Struktura psRecordDef - obsahuje vsechny polozky ktere jsou ve formulari. * * @since 0.5 **/ void putData (const KNutUpsData::upsRecordDef upsRecord ); /********************* PRIVATE **************************/ protected slots: /** * Is activated when same button is pressed. * Provede se pri stisknuti jakehokoliv tlacitka. * * @since 0.1 **/ virtual void slotButtonClicked(int button); private: /** * This class is inner class for showing items. * Add information about order number of UPS values. * Tato trida je vnorena trida pro zobrazeni polozek. * Pridava informaci o poradovem cisle UPS promennych. * @author Daniel Prynych * @short Item of listWidget * * @version 0.2 */ class KNutUpsWidgetItem : public QListWidgetItem { private: int m_ordVarCode; public: KNutUpsWidgetItem ( QListWidget* listWidget, const QString & text=QString::null, const int ordVarCode = 0 ) : QListWidgetItem (text, listWidget), m_ordVarCode (ordVarCode) {}; int getVarCode (void) const {return m_ordVarCode;}; void putGetCode (const int ordVarCode) {m_ordVarCode = ordVarCode;}; }; /** * Is activated from slotButtonClicked, when button ok is pressed. * Provede se pri stisknuti tlacitka ok ze slotButtonClicked. * * @since 0.1 **/ void makeOk(); void moveToSelectedList (const int codeUpsVar); bool isExistSelectedItem (const int codeUpsVar) const; bool addMember; // true pokud se pridava polozka, false edit KNutUpsData *m_myUpsData; // Ups data object KLineEdit *m_lineEdit1; KLineEdit *m_lineEdit2; KLineEdit *m_lineEdit3; KLineEdit *m_lineEdit4; KLineEdit *m_lineEdit5; KLineEdit *m_lineEdit6; KLineEdit *m_lineEdit7; QCheckBox *m_savePassword; KActionSelector *m_upsValueSelector; }; #endif knc105/knutclient.lsm0000644000175000017500000000062512073504127013046 0ustar dandanBegin3 Title: KNutClient Version: 1.0.5 Entered-date: 2013-01-09 Description: A graphic NUT client Keywords: NUT UPS Author: Daniel Prynych Maintained-by: Daniel Prynych Primary-site: ftp://ftp.buzuluk.cz/alo/knutclient/knutclient-1.0.5.tar.gz Original-site: Platforms: KDE 4.x Copying-policy: GNU Public License End knc105/pics/0000755000175000017500000000000012073504127011104 5ustar dandanknc105/pics/knc_upses.png0000644000175000017500000000166011436653726013623 0ustar dandanPNG  IHDR szzbKGD pHYs  tIME  ;ݲ^=IDATXŗMHTQ7_0}` B"jZZF;_2XBXcB"iLkj$}5}3Λp>=\E!jޮTP:6v; %<^A` ԏ!Ya V``e8Z \Ҭirq[E_ԮCL/<և,W#ehj9[Pl*&xm[19%OG3M,!}3* R^(4fdp\Kv #5S;qhu<aKFÂPW$<=;Uuq/WzҰfCh<`3,s+G]`U -oƒ; ףZ=9zZo@ڀ3;fwg!ܥժTp8\l$q8{ .AE8qv[sNF3=p8β,z& "Ҳv(t X)9T59Rǔ r8"Z%XE2 4!;lNa”ۼPS`0HKKH-݋ /UWeKC!b<DdRۛ, 0L XmDN*`(ڠK{WiXwAUU~cА$(tkm,kD"eY:+s^!|Wv]BP0M˲D"TUL`0H6e}}]i2ǵk(8+_aHo B]|^/KKKȲL&åKH JPAEŏUU 4{zzH$JXd{{jʹsBP.$ G<0 w HId0; kA`0 `>VP+s==sCoiea]7(],²#ZƓ'OXZZBUUH& |l(/Â˗~P((xl6聹9,qAA__+++T*z*3.^H*BQ޿υ u|>Oww7d>:X-2 Rр66771 aYiB!eJ8Feb^0 F;;;yl۶$D"h3gmgϞϿcU,266a= BϏiE4k|{OW&pr'@JR]vrGu![+:ҙ&''\Tdtz] ׀װȿ UĽ(R؝@s}iymiqZ, ގieYhv,Py͝o91λs՞dTIioRmUBx %DAԉyy''rp>g2333[˗) 088H$H$r'XV鶻1ȳtwJܮ&I,; H$Kv/S ;p|s9ykHF#TGVnba ᴩX,~-Dn?.=̟^O!ʴIENDB`knc105/pics/knc_mpref.png0000644000175000017500000000246611436653726013602 0ustar dandanPNG  IHDR szzbKGD pHYs  #utIME  2 ټ]~IDATXŗ{lSU=ؘ0l%&&ĥ`*$$|IH !P8:3ul&0I nn/r=|=w`bY؀l`h.@|A"RбFHQ*,2n59<@p8;W))*% kT2>HQS2F9mL>?OwHI#IGࣴLB6BN'.ֽ0V^K0&Zh9JBib kࡉveMM+.W:|rJjB2|DyF jjjeXUel !N|'T"`2p:TVVztm5Yw>3ƛfQVV'G!AUCê6 ʭ;п͉{*‰dϊk"cx^S 2H,qw1cT5yƛloo U3stG5|!_JPx"obӆ`Y !OE(7g!"rbn Ыr3E4.(O$ĵ``B%1h:[we=nntWS>߅{y)M# hFP,&l&xa=p["$RVn۹Oi:)x#x1Mp=Ӫٺ"ݍh~ZZZ7/sZM۪țVH 2*#0Dݩ߸@Y W=kҕU2}8 7Dd#V6UŬ([tTd8k5ۂŎYZL0':7($DPCgnğ) w|iHf`eA(lD_`.0qps{zƺ ιEMi ?>gs!? ͏ԶIOHŊ/Zwy3K1z֞{FH qryTE3Bi"VAMSV4xa7z"X[U TU@1zz05 a}2 %*bԘU `Q;/([}8XSNJ3YN3\IENDB`knc105/pics/knc_analog.png0000644000175000017500000000273011436653726013724 0ustar dandanPNG  IHDR szzbKGD pHYs  tIME :2 eIDATXŗ]hSgsNr6m&RҐYpqtT{# vQ1D; ovWحXyk^ &u ]mY$ b}oZ@_k+Ml;n!2z۷o399a a^EQØI6e۶m,--ix1wﲸ;zhht:$I ܹsd2i(eEX,2??ϓJpݬkzP N' Sd2DQ^o˲ܻw}( }}}#,ۺu3gFK #eM??/#P 07¨5ʐ!87-Bu2?s컿h ld{Y!vfQ)ȝ=7Q*t[oa}0Rgg^Oc.UUnܸA:&HP.y=#dggRt>L9N x>.!|5@\.===8 ### eYJ%tuuL$axjIV?/_Xi+Wy@wH`4T*ȲL:X,:\h4JT'IEAvj4/\ 43|J~S=qV4 ao@  H$Va4a0::J@9Axt$Tǵ #xX,lO(h1Ţ@4,iR*(bqCFtv_ۍix^ߏ,˸vڶ$Iu۷o߿zw\޽ݨd @|ёfMQO_l3`uuu=zj5[o:O4r^׆al>@>av!JR$IN99 wގ!d#\0x<;aiDX,F\FZg$i255\`0իWP(n7t: Jۋ,v:Q7r~'Z[E:FE.dl1 _BW?SOIENDB`knc105/pics/knc_mset.png0000644000175000017500000000310011436653726013423 0ustar dandanPNG  IHDR szzbKGD pHYs  tIME  ) DIDATX͗yl\?8䮱Ĉ(4PQQi!R TD%$D!HPC *14$ ر!!v8Q;7޵׎ǻ?B6J#f|f$C?8@@Bg.L$Bo:-1P 4BoB 9ՄQ bx۽oq]3}Lϧ/>B ۿ)+qX{2Y>=Z~7Y3?9k{]"Cwb,]ciݣ9"xqG/og?ΞDLg_S kLڦ/@,"=ʾO9n{@'C D)t<уp{F~`]Ԯv\ٝH"!DNNe!ho.ʹ~/?։i"-n 9)`s'eD(%v%srPq<,rS@UvT@xuy,1u;fIjs&15-hN1vqY47-XU@>ƨGec$BH$9/`K|)Sxw4#1IP:E%7rlzLYdFm=deY<bLJ3J8;NP;g8f0 Jv7r{^u=zl}D-n2-[!P0:?X"! է-Cl6oa 0PE_@z?ʁp|HKuV@{U҂µ;:oc&*#h=1֚njvof0 d\?evYIٌ"N͍ ICgGEhqօTAMk+/H LB-& f#k( hZ <{*?nb;)-R&݃p5EL]g1U|":&vGphltPoIblcFkU#OmUhIt4B/yyY~crkh8uK̬jMH7tOH٠ AtlD tኧݾ6/77{]VcT(tۭ A&?q֬Y\_(Y;1Ɯ$:|=jUUqlBupܝ<_J _֛'y{z(tjՃuVą dF$/@_]%w@ݣJ@e[&O}iq!+pD8:;mQe۸4HI %mB768Ukc,qO{Q*K_eiAPx^ox\}Y}?H`4m"%݄\DQd2y<šطAAN_J7oaЗs-P仯_6  H_H?c./g,سʮw0YZm"ףQ¦\~xgAIENDB`knc105/pics/knc_batt.png0000644000175000017500000000041111436653726013407 0ustar dandanPNG  IHDRĴl;sRGBbKGD pHYs  ~tIME * ȤIDAT81 @oe!MchƒXZ V! &MPPayo̸:mMw^Biĺ5M*ar$GujJ93`I)mu HWIENDB`knc105/pics/knc_main.png0000644000175000017500000000105311436653726013404 0ustar dandanPNG  IHDRasRGBbKGD pHYs  d_tIME72'IDAT8uMHQLr EB(E̅"W-ڻ FVeDM[BBY@L(浘|dA΍vI˫t2Ѱ{k1r/#^X_ԇz,βE~`TZ(`bbԔS'F_$,bFE" Xl.{#Iw ;{7܊2PK^OW#Ju"Ex}b^7\1p<|; =RUB$rH܄1GhK!#8 ` eDj!p <3o y'!tJ:GBlyߙ!5KW$ol.D rFԔ{9Cs@2*"}368 KyX0H@V7NQ<˸8'޵?@2m.7>W%}2n@uc,׵h ,V5#~ft!;1^nFr\fnt5>v< RP8OIENDB`knc105/icons/lo16-app-knutclient.png0000644000175000017500000000025011436654003015502 0ustar dandanPNG  IHDRaoIDATx͓ 0tFptG,dl mH\=D$2R/i#O]< _ Hb.;  ج:h/QU;D~&jK ~#ۖt_IENDB`knc105/icons/hi48-app-knutclient.png0000644000175000017500000000170311436654003015501 0ustar dandanPNG  IHDR00WbKGD pHYs  tIME,(HPIDATh՚?hAD#HШ!QDp b{lak [ J"E j ==;Y9.[fAz[{E@.2`$ODv# P~.&)k 0 _?%.̒\RY|>_pn:#Yr\M^|/ o!`–[ 'Txg6g| -WNax}w6 c3,Qxh4 Ԛc# MZNFTOk3 FcĆ>7\t = ?HP|sIఋ, gt7*Qh?ЉB얯5rM!VjS${ H%Ldړ7w>pg DK|voz%zr{Heڋ"b%lQoaWm޲ xm- g{݁@;[ G vC8OGW&9ܳuدz&2GD$lHvP#ulK/U%sQ禅j֑PS.tYrY K.AH\޲nkߠ*FGG|ZPSٸٛglY[B{,¨&j WSM=@2 ###tuu UyayqeuWVVΒ28vV\?ZWp갻)K~SʌPے@/5^>b;@Ei %̣]J ةv >IENDB`knc105/icons/CMakeLists.txt0000644000175000017500000000005311436654003014020 0ustar dandankde4_install_icons(${ICON_INSTALL_DIR} ) knc105/icons/lo32-app-knutclient.png0000644000175000017500000000051311436654003015502 0ustar dandanPNG  IHDR szz pHYs  ~IDATx ^7) ]9Yأ($prx8"~C$"h9hׯ,4\X+e&tecLЃ+:,²Uǯh@/` ˬJ:E)|^ a1i6 b@4zlm!DtKBp! D#ЖIt]k_T@0 D۲a-[[>㶐ND_'\PE@+ ɨhN_曯IENDB`knc105/icons/hi16-app-knutclient.png0000644000175000017500000000047211436654003015476 0ustar dandanPNG  IHDRabKGD pHYs  d_tIME ,&ې.IDATx 0E_PV`\ b$ `):DG .Rt@B cP~wϿq$"Q K >' R]<}\ `"nb z,`L~ypn# "gq5[Y6PJM6؁uG`lp{;1RUD}+x6Ǟz}IENDB`knc105/icons/hi22-app-knutclient.png0000644000175000017500000000133411436654003015471 0ustar dandanPNG  IHDRĴl; pHYs  d_IDAT8kUˏ%ڦ&DKD@q  !ۅ n]X ZPRĶ-%ՅXQĖhMI]oF{ \ޙs=JDm 6alS X&jvZm>lPxhG"w{ٵllGQ0=_8Ҿ1XIӁpɦXql,s;o}^,oe0q5ޟ FF-> rc.cpp # if your application contains tips-of-the-day, call preparetips as well. $PREPARETIPS > tips.cpp # call xgettext on all source files. If your sources have other filename # extensions besides .cc, .cpp, and .h, just add them in the find call. $XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h` -o $podir/APPNAME.pot knc105/COPYING0000644000175000017500000004313112073504127011203 0ustar dandan GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.

un$8qnӧNq0^xE4h@)vilt K)aO.^TnņNsk~؟ lNlpv-/7/==<.9|0?/OHGU=g9q۶mӧO^beӤ$u._޷o?ĉ89=~d Ⱳ0^^[ؽ{whڴo4c㿯[㏯^O]CBrBF^=k.M6!M4gkl7oٲ?j7~Beypםw |} Rd7L|MU `_(ŦEz+t7,i{aL=FrӘ*;cuXRP^1ƀ%v]E ywщ9hРA@aQєɓgeFFF@]:O=2=tRBB"e%K·(Ϸl"e d/k_hц?3RΝ>| /VO<LGh2,Hƍoc+WZ9u(ܩW a(~+ř蛼NwiUˆ6As8jEx$ k*@G[յ}ظq[jbbbKO}׿YWv]־}uQaX$׮]xx[_K4 2)cǼ ~gV=}m.[nԷ_?c~7jhٲw,YܡC?pXal<Վ[BM o]Hp(76$Cٓɟk:1Avm#"<8с  A.J+/4(eܸ#F! ذWvS}"+̰a0/?w)S }t($W*gjMH`S jԨ^ߝ?cD 1(,,>bIZxDPw1o\I{n!V6C޽;v|r]`F nܸ""iL:`)AAAÞׯg'ĉBBB/6JR"6m>|XϞ=/^Tn˗KzNԓ''MSNᄋ/n\ܢuuؓO|g.@=$Dj"jB߇a4"=I]EaE1EF[R/ՄfJa{G%r3}L](!C\[i)=`IBJGHtXm'v Stspҷ))rG+$*KRݸ))˗-[n$IV\jդIBHђq劕VhnwHHh=v3=%K^[0It>ˤIx~KUzɉбє+/׮SH'^$S3=;W#ؕ _~5깂W^y&&((sύW^ۖ-[|U8T, 1VOV'k%ˊҧ0x+;TTUҘ#(LĪUEB6$[eJ8X2D$z lc5ܬ%%K#Y9Fi]BPmD:H/`x06ejA,). Vsy5lЀ t<P('’{e߾}&Nz䑡TbH"\'NÏxC{Ͽx@{Awş^ѷ cv .ڼ˯no?LCݲeڴҥD)))ٱcW[o].W^cLMV/V/Se2hE" nlV7%Pո$?0uZvȤ@p1&+˪@GĴDP=N jժM21A@bēOnذg}葇NjIѤi SΗ_~#)x≻+2*R<)B2o(C[nڵkN0GWғO>ŶVmtF5 I.oz%Vi![##իܙ6ZAu8ÝnQIJLw wP9q^YXX0t裴`℉=4z.]ܱcGݗ-_F Ng~~i ƍk׮ŋխ[cǎiii+Wx7'`ŋ^|if_[<6T}1BPhۇ 2dȐ[lNԯ˖c׮Yk V~K.|7.ewߕ$''Ϙ>ckNݨЕ|]t{(YkOu}a xTީT] Էݐ`zZ̾R1n0#B{UbQ^gΞn׶=-U\\j_ڱl "=NU,D j#r1>'$)/)©4h@6 +1k1ǘ `ty=;ipZ~$QD21nӦ]DxO$MgmڴsGH+0ܢjrGjBM&DܻP{`(j׭26צMQQEŇiӦ3)=FCn{춶<4zݻw!&|.F!` vۻ}zfҒ}ڮ]-{D31tLfխLc ,ꪠ,-Fm<~RǦE7X7m)B(ēU$xkfY๚*㭤2D<ߪa4LI2>*(ϴx+(uVTZZP&L43{Ƌ| ("E8&}b#2mRuZyv]LAWAA (#*O> %&CsC:=t b5v,nnoA ۷okٲebb@T*-:~h>}4nRz.Rsc@^ꎀ`RwgV2X!UbET-Ć"l~b8_.Q 埲dP0Q(ܶ훖-[%֫P&fiiIfF1ebU*od:mfIg`JKBэ EJLL$"$=./bMDlkVpɔIgff?~(bUQkPV*GƉ'$u [ IR2,,??VHaaŁv-22rk4 @JiǨȡk/-9HJIt⛫:0*@']PdBUř3<ځUiA6,}hAWN SV09tT&r,n1"lLU&?+\vdI6-@Ȳ`éljl6vb9EEEtbFEFT[UvtBpp- H-R!X0eP[,Q(kѴHGl:hKё$HHHH]WSZ+o?r+3`CA%$/QSC$=%%!!Gf"Cp  *ƘDzrΨ սZ^@,v^ϡ, Sf!vkQ;oulQ  ƈu~!_mElɴ1N00dTUM,FّL'`CzROX7dfvAo*^((nxDDx<v6X IDAT,ƈER=0ЋbF4d1 CBBL)`v,ĬTgh ⫢B3R `|f V"\@#p:Ýpv\.0Gi[NvWjt=DCȹ24I]EvӌƁ2f(HQ FJW#v@dL$ejFcv, E2})+]tҜo-!N:v:KV P3@wʊ: WRª(4cfPZTŴƩv\!(n1r#HDQt*D$((()BKKJa_LU]JKWniVTyU3~bլјN9 TeTF׋b$g\}H| R5Ak\_lD kxVbՂ "6(4ɬ^13b Zwb 0@XQ;P/vb`Wl;іEfjQPtI&ʎ ;hTV!rTGŃ0v"3 @R2-)I:MmJJJ-dr0(ށvfƸM1eE3\R\"w21 mK$0\., |H,JC1Va=ӎ%CX=a OcT `(+LJImbeEr*zr~9*a%*.35pp~EY쐼&.CE7%b Xyu򋀍#dE(["~# aM`n/uR\H-0#9BJQȯ ` `p\A0V^WHjDZI(8Bb14ME`zu+B,%A1tBc+*GLUs[6-e&rp +KseSҼH ޝk2,Na1@zU+[[i̿-$6aL#;[(΋agSg2abR@Z 4HR32"f֩Mň5p]1E7ve4VW1b` fS=u!A4i&=6BuLdlVX7 TKXkZVZmOYXV=wzl^j%*#!a;]/;3eXZ\BEɀ1VEVf3hcK yft%yQU[KT'@-{ZbLL0)@WіpJ LQ;M&)g9eUd֩t"͊*FVHVGJ"hb\4JU*a$ID{Fв-c,Wu}w|ȭFtni91YE-˚n^,V?V~EVks|زkq1~2ԕ٠m'dSwLb4kRWH|'AmMSZt-ElȣN.<25RҲWE>ULKe k*j 򑺲+^{CJoJ6FV-j3nxyi<f95,+eSN,fa{nByyksلyK϶S.[Yym=YMO^?!Po5i2zk$ƖO5BzQnR1T')&kz5/nd$GX&o{̋~qW)[})z5j)XI02(%$ VW7EIq Lh"@E?XN7͚jP|.vhkZeFЙ dڲJ5ЮFm4v(R kvX;c&2.J:KәN,_Il*PF0Ł bѨm{U1;Ut`33)!K /c6`HH$h-4HQM0#K3*36H"\0nu7Z0ynƶXQ.JJ>}[h>:|Vj n٭q%'pc"%4 @k{c%e7tSAUF-:-R-ϪH+VSY֜+hQLZL-7V7@RґEeIVctVL3y ݇2>"%nK &Tk"| [0yclVNwɤ-旽V-3i 3 5{&nvA;z}<20,^J?yFTdZQ5]tL:YgYB, fEjj{6[BUgȳ[+AT l P T PȿQlV-PjerUAnzTT6[41Fe#Vj:*ŗgA`(ҬZ= ƭ,ϰFռB*/z%YL,\[Ko -KM4S{I}I`[$\0f [V`JeK25.2Ee lT);e՜@%Y^xh-G]MM'TYU"T d?Z S%`;$#ѐz٥ʰC75 jUU06KF ]cp]ʤ`ٖS5\KQzEeT 媱|m1ɤ?k?:B$ET5]<&nf'2ntQ5ޜ``NG̶Q-Q銃q9aV#Wz=6f Q)f;Ӳ` WH5C:SS)f<6 Gg̈ZROZAۢ _B/RT+ (^$1%S_04m`5 l*'d4-eAq+ R[Yt TUOcߗi@* :XIԀY=Ջ@K $ByVKK"$'믔2 H;׵"!3[ X?@;UIIuѭYQ9zT;澾 [P h86̦CK&BK)UxT64/a&Ƹ<@mT=7%Vxhگ Rʄ(QV:M'8fy3FkN~tUnG2cAZ DZRK9hM|9 fn[m`/ o5k0A!=[*^bFTY74AD]CǦ;}dH̄@ ƕ_XmZi]3 ?ڧu=hګN`2au(DIY1RMfrk^W𑦇dp6 k5 a4P] küY&^:`k/fc- Q5b[~.Y ] +͓e<;2E11js+Px S&:uwP|U!JAU7Ij:n:!WeR.yYgVIp:::cI1"CfƂH!َhfÂ̪m)zW^J%zJn~4jj.Z&a2-^`Lo"%]g/k S?n:FD0`_Ua$@ 5@²;c."7@Z'i.oi5uE!j&Nف5>dHf6\R]f1&Vvu&(L>ĀoW1 cG$H[Ij (>l?4')E;Gٙ*1%C KIfFzGRGqšB{YBI$VlYLdJC7ʩrK_;])!6a@ehVJ V 4,@{Ҥ 2]P+Wi'%OZD Snr4!@9FH}(տSc QVU=tkcē{(,ލ7  SNIU>q, I \0bHçeǙ,2U)m dY:ocx\Tr(a=_lj95eXS]tMͭL9U2ՙ UMv`VB(]UiYAm4ʁ1xpu;0+Jtmd3Vir.WeN!F V]^@HQKKKck׎%2N`>hG F'ǟ gS9~+7}p8*wKxh)ܜ*J0K4e\o)U5>fRH׵=LF]IK4=gxim<~XR9Mxٟжk/BpHHFO8n٪"Jíkש+b^n^U#Ct-:V[lE;߲]@͐=Q:R^Yܴm_! |'L2cjFeр/ VԤM)sԶ+ܮYjժ*=xrss"`sD4-]xr+rTs+=fE$ A3$$&LTi:-ML Z 1sUhguPҭtзL:)}6+Ov3S3zy&Emb,U %j;Js1+⢢\S9U `KJJ\%A̯ ]sX/:ðb ŠaŨU۟-2e@zOYVN\U z2LɌҬ&膳LXw $]*/^FV=_۷M~Ԁ IˉrS&1aըR'=5#*=ly(q )gVZ'=Л)# a:)t)I]H=Xձ[4VR}zzmj(^UP5Kˤm 0fi$Szn5d )ɂkI Vw]+ʓ]pipl\s{e5尖>c+5s]eXnѱ!!EN?xiec)Zm{i!j̣c*W]K d `᜚O٫4θX&Vky{=P$FfjM2M1Y!DwƧ5A;]P1F>$L~ZyW.#UyPGjjT+DOy؁Lah9&2) ȌuЙPOuvot¸D 1V1kJtʰXޛ3kY j #:C%U iyVS,7CI*ˤQ(aeSTJOn73njneNumTkffeۻ7/7>WΝ=LAʠZ)BAM ?skTTjZXQeAcG%֎ PR\r޽έ. DE_)2#IiZIs㏃j[mJeCyXCzZI:pÇf' ǟvݰAE K׳رs„ӦN~=vL0q"9ի=g#(7 h[[nW4Q9|2~G[j٢Eu vZQqqZn% tR ^ָ?ü<ͫ]ܼ[׮tN4y?KcǦ QQ$խCK99 [Bb<-uzvbBnl 995>G3X?ȪUMFo?v#X+"@XEr5##cA1;vܯ+Ich$\'N(cϷ6{iʤɓOѫW.]:STlL?SMv RnۓkN5rA x}Ep8ƌhJiI r\|WV~Q }W^x1MSSL&xwDFֺ|((^tD_xr@qqjNG=*jJʽG4ey .0JڵGxz֭7X?3kF٠AG=o^Ϗi/=zLlccIz:qFSgnwPfp98S! =z[.uJk(gΞѽ[II޽rK}왳=ߜ!bZΝ/v#pϿ4nԨrsvZ +Gt/_88nfTbVV]-Ձ0h;vBZquM*8Ve^K˿T֎W88nNH.-)IW߯pn8lB|΍rp`֍ kE[ !!!!~K?,߃s+ VU7]o=t Timqppp(wpkkWTV߃s+浚s¢"Bc/_ n֬yZ}u'@^^ɓ M5͛έՁK.'%%%$$׵pp8._¹O8Yӊppp錋k-w^k[Pt:Y56&OO2_ !!!бD,FSZjEuyԨ臠]˘4iRݒ'?Svn[1?͟b߉Y9rȑ-[M6O:~7w_ƏOMĖJ^/d"#G??ԩScƌ;ub cK.t999GшziK:u>|JoݺՇ~xm۴i gҥ{رiS I?p%'?۴KbpmZ^0o͚KL9ق _լYRƍ{]x'-yᬬs$ܸr劦MӖ-[K.z)2v'|v 6\hIe7o|Ͷ?_~C6m:|ǎݴip8zMg/wÃyIlݺ‘o#?hFouv8~dPPМٳIŋ\|J!&&f0lKкu˗cw_޹UbE78Vq$N:[_\\.g:u.\иqc6g3gnns:6%}|?{͟?/--MŴ <{1c>˕sի5kfSRZp9._Wi,^ƍ #?+\&ԩӦiӦ9sFExIh5>>[6_tR2|ɓ&?NǎС/̜qʕY^HK0y U7DxqZh9b;>Ucƌ^dGygY׮]'S,Yb3gŋwiĈګqG; puҹty:<3;w>cM0sNo梅$VuϗOxu?aBn|GzlӦMo>:vHLH$K~Y׫w}uҵ:ppp hmoӹNI% x=zn+Aff͚VvDG/={4j( 2Q}A=Z$U߳skunXZpppE1 *8VBCG$I~~'`up\v-4$Dw),*kE>V w\\TXӊppK{pn=8rpppo4G {hos][V}^B~+&䤦!A@a/ 4OJ딧J A ///D'GM=}YRRkjՁW&%%%$$fe(,,ʕ+ftZѻb>_AG\\$Gt:ⲳU7~/: +!!![۴mcҦmkF?1y={tqỾ'8888[:|mU˖gL'SO_/7q)c?э b?c"""#GzTj*9=rGGEG;v{Ŷiλ!yC8y_t1eܸݺv1ggVѳGv5z׿ߞ&DgoN;M>Xio4iܨU_ҥK6iղŮ]rrr5Kʾ~t͛5ʊI˖ӢyǏrooݫg|\OF/rNʡ&97nZiR9mٲҷ^t{}}Gn={6I7nO>k;wjР%Kh׷ov\ʸ3_Ͼ7ƥ[d1f͚cǎܹsWñHz[CL÷#$$䡇***:u9> ϏvWC?] bbbbbb/XgHbpPPkYY.}_Ϸ I x1:tX$66v ƍuM6ѻ{AAA(ǏbޖH1-X$ZTC"221[$wy;;v ͛ÏVZ|yqqիWNf~y֬׳_ϚKCHs#G𞁩'S-^\fϞdɒ.]<3'<ܡgڥ̙3ecSΟ?׳gOrҥ_}U xw޽ٜ]uճgrQQ3_x$=Þ~9g\遆,6ε+QXųgٳr\ gg7kn? /Wg̺^588n:ԨHࠟ~QF]-I*?//o}謬(8Vv([ccAx+qsBE*dny+ *B`Kf().Ւ <Oaav;VkY1@aaaM+!GSp@^^g9g$5mt:kZߢzskujzzRRRBBBHHHMW@QQQXXؕWǷZp8n't:t߻ ۏoQ=ծ]*JXrŴӫ"aiVFs÷ y6~|jqkvڵkױcL>~"''O9j:}ڴ?٘+L9g7iܨi+*NAG}…b>Դȑ^zUaA]<%6kx '|"zD6eڴ!_.?#oL@G}t̘W$睷۷_.]Ϙn|˗Əн{N:3&;;;//־}sn DQ۷.\?חkwܵf>}ֿ?L2޽|cǎw}N ~Q>|'/4nݺu}Y?XtZFJM=EN].ٳ{ѳg9縔knGq۷'N+q{kLo{"""Fs!z)''gyg7̝7?22222r>PCVؗ$k׬=v觟~cñtR]=;wܹsG ^_zxxwݹH{n:**-zEl۶mKI7s[Kf3[aժZlqIrٕԴI|\n],]'NoߞV}ĉʥsPܸjtٲe7o-Wӯ._Ҕys>;rd&Ml}~iQ9D^VZ bԩ:q¤oݮ_tp?={'ܴi(w{=RyᚇG|{GEϟ;G9Y7^}UZtdf]O=u}kW^I/,, %aaaK9`k$q֭3fL9s֭[iiSEFFY#"6&VX1o;~l1 +y啿vF9>[q%@(isn88##СCrrro`ݺuk׮]׮]srnV[o۶ Kx߾t DG{@ {,"oٳg=veU8hҴJ3fk٪ժQˇR/(( \M?x6hHҳqB|Bvv6ke>3Of?Ƒgssrڴnգ{6|F97;WTߺm5&&_2O>ѡn߶?xS6lpmxE6ŭ[zw 3̙Cӏ8ѼY A$rܼy8x`+a+W˗/GFF֬>Uᅮ}ލ>|B?>x'{]O_n$)++k'\# yh9.]ESg蟚*-- t8W.ϙ3i& e;XW^oV~f̘qYQ1Ƣn}6xj/F<~(ϟ2h`#`~zzzzzk ?:ʥsXλZxqvvvvvŋ.lNOfPi3:55UŌ w܉>L8ʕ+%%%_}Ւ%N]Oǿj׾fб7MJ"O?>s 499]W_%S\] k :u21Aw?|llly׿ɓ.][^/G233 &TƽRO_ziI6lzAʥsXa|ʸ-wнpK16-**:܀C;9ԓ'kժ5`5kyߥs;=77k׮~UQ9pm:*DQ<{\^ ,~ŦMtĉM\̹K-i37ixԨQ`윜f͚vߊvSSS#o?sx@#$$x?6j0 2Y!;:K|~UP5M/Z\E  IR5X~ϟ]-۷auԩi]*QCh3ۏQ W9p;1$I5H5ۏoQ=?5GQaa(lV SXPrkZjsk5ncI*n+u n?E5bpppp[9888|έV߃s+{(yw"Tpppp*9B"P!*|UV"GܼSN bCB6i_~ߛ돲k yϜMHL9o9{iNMEn?E؏[+b&yKqp5==)))!!!$$u+(,,+a&5Kuۏo~|Eko9ΚV/]ӊTc?9@xx88|999<ٸ`?Vєӌ88d={3v jZ#okb--[xjZ5?qȐ!;wg/>$zaevͪU>>> HLLww@H#֘+BܻwC/2_CǮ_A/33?Q'O;|_v-.\`ܸqƍNN7m"s+W Y\ti^͛7F3/<.wڵ CA=I u&J}6G;v;ܹsE>ܹAրw+^xԩS?&@ky4oe%ee\;;U+W³gDD,a -\x5%K6immd2GbܚAl@勗qqÇ /33LeeeZlժYp8D1B; [---ss󜝝ܼ<:waݻw>?uxxŋ}X,it4AB-NsFFF;v<~x6.R慅333:XXX tƠbl˓Jyyyn0,(?|ydVVT*5^ƍvP1 #I0w@ - U2: `_\ҩۘ@#D"0W2'H$@"iִAPPW!H CAȒEr$3i9` ~G[Z/4MP g^ DP((¡+iH$(f:+i1`yOP(sc_I PT{Yd2bo@ -(V4 Zp<.72"OLC ו#zE[WK3339_?4ml_׾-!jmzMl7k+˶)ӿYDt0H(\fueE#UO}jT*G-[w/X;`ʼnb\}#Fٽk!C"W|m{U;Nx{{9zdС}]nDRaaaҥ{QXݟ>>윜qi-xڵ} !a!YƳcǎ9slpɒ&M|KpkVϚ5+5ݻ_T&HܾsJӟj-{qygΜ9z'j/$##c߾}׮]۷O\\\u$))%%Pv1)[UU}c~&.{ {9IgYO)BZ:0)Us9w޼;LE6lf߿TtϟzjXXK^JZp}KZ[[LUvٳgqdeee}] a®\ ?ޫWO:fCBB<|tzi)FGE)z>M HKK8abڝ4@FS_ͻ+ne­ Ɣ)S޾U0ntҒ%K-Z U(AkѢff-Tܕ*meDghn ^g ];RYCyYXZZNK:r$&&fq\{{{|U+2}0 EQσ9'd2EQ2Ab[ {{{o|bǮo߼ @&n\܆C8b/^?@н͛WkV7vP(|ժ+52BV^1`0]nG2jU&tV*meDghn0a}*]^C&ӭGACe¬MLMg͚*,0wqӦݿ.(tGSOuȨC'Otvqhw9QP+REAAPCeTcff'{V"BNPB!+UN{R'S tǭf3γAP镋LFLH$eXxӧb;x}v[lr\.w- Tژc C̊3fس{!2x߲iСC4O<7~kAqX$it:0nÿa+V|Q*b~)$%&yyy<|}- ur[ny:)&$$x<^4]vP(,))/ʪ+m9s"Љ )BZ ]--~:ؐ0750q L<1ݳoonjk׮S&OOא9s-ǎ;vX+K9sÏ?u7o~>}VZٷw_1x)_FZӅD"1 3_0gJOFUVW|ѱ)*:vvv'LDzϮCLiC} UPKJt⬺pևrpp`Xu=4i0 gt+mta2vv$Wfmmml \?`D&h49>C[ b1@ CwI$d0(D^| lB}&ێO'_x)۵s'NܸJqy􊘹!s߿/_h%[!: *3s}l.ܼyϟ:ue>}ejf6`DWO'vff)g<==t:^0*K.333kGEpsssss.U<{LHpQp9N/.--+٭ZM,WLFQLJFJBVVVcq[DDxbb\~18xS}?{@MMdeeUD*x Yǎ0 EQ[۷wnOjzVHuvvwsss9̝WC^aXǎ—-YϏbU~WQo\~kiitZN޹s焄 M[j}5R0 Ri^^/l6l*OO"y\]]]ǟ$%ǟpH$t:`juSQ~ӦM\n[qrǏf͚РAsCC*N>ٳg͚dqX~~SXg@ ~]Lx,J?fgׯJ,@ :nhhxMge~Qnr"'@ V=зB @t{o@ }+[!D@ @ V=зB @t{jI* B D%;B Ovº.G_zQ>|D"~zP`ఠkׯ8;=~}葱Q,\4yׯ߸~yTQ2#ӧ/\PVZkzǏ~:NOHH;w.\pIBzr߮];|Sǎ۶o/(WX}ZWreȜ98x˗Uj ٻÇ'矟?_~-#Ju@ߚzC666666\]o޼5rԨhJJʨ#ɧO{zxt6=޼+kPEe˖-[KrϞ=acc24\`q˗j*/ 5a^eZ~=.ܴiϟ6}xDħOji^N+)--+ڮZWPֱz@Y?h钥 O eս,U?aÇ?or1ݻ"&m޾y#$mU'68\⒒q0 CQpZ+<)LFQL6BJVVV9'._qaCj^ݦ?w^lْ>h`EY*eJKK}jB(}kYYكEGԜ@"? @Y*J:88*ZZZ$N[XX 27/ ˳ҰLBBkddT~000 ^]Νbvݟ^篖!ױz@YKK˂B}]B(c/\ :[ᯠ/92%%̙3#GKD"N ֬[M%7or\M*Wqk׮ϓJ߽\ˇ W,r7nܤCٰ!//O*/ÂU_ b1=p蠫k2v%%% jnyddVVT*0 AQ:7 u PV`aϕ6QvNںx ipz#FJvy/OOD*H==>3gԩӜ91~¸v6bĻ6.S~XrEj̀޽MFRqu]d_B¶صT,Pֱz@Y9]\L4i6v~2e q'O0Aᯉ:w3/[ TݯJHs D u35>Q D43A3y 4QhQZɓEᣐ9IGzTRsWRX\0uЀF&6#:)ЕE6/ZRw/ .D-̧6ٻo? ?SbaX --`15u[B|L̊-!?dei![%މׯ] u#rubZwaǎDk[CVfͬ u7l6;u|r|||vm;wx- }<յ}ٗ%$IW:)A0AE"$O =RhJwZPNB)IZ%ׂd:Ӄ~p8 :"(eˆ!(b~Ș!(b[0dB71|4JǾ3`HV05+WTT;;;^fA~^^Ƿ>|h zC΍XsOҟȕr2>uΝ;wy֭ϟ? cպҒ/3g*))~ETT1*V2MMMnjJKKswwԕ- E/CWmBBl 1i9\)#΍ne(_Qa#ru'v23gx ]i(<-wnO"X{ bAFu1<Kntm-(OH4?ԩkU[Azz:` N|fqO ~@4;'Z6733+/Lϥ֭[/C|(66ѓNr\O_7nݸT# Oh¥KK.P1 5rdyT* 'V-AQ b~؛bIr\oR֚L*i8QUiº~jp~f*3}a\يzᵠg+# nҿ-}U^I%8rH*SoiP⨡)ֵ[UU%_]EKl IDATd2NǰfnjbjrQ511S Nܼi_122^~!Gktr"?_|eUhtmT*WLb qrr~ѣǤYV$"0 (B?Iŷ:PTnI%6` qc/kqNA[a]S&'F1(,GLdAgxQh{+7{'Zж7RF[HHWR)Ѷ#(Fa]v!;V 7n-!8㯫W<UOϚe >gLY =z8]~m^ǷZ[[溸rss ͥW꧶@b ڡ1D<&(#lRԀGT ieU#?❘fB!XHER۠\"D@adhq@DؑǓR,;[Q44V^3EuL--L[,Xn;wⴴ_?Թs;v"&&&߿'vgϚ[Dai3vEL SZZZEȧN8,,;T*YfImei2.gϞTu&LXӵxP?~6F$#l?okMZ׊!lʢa㺳?JjQV>&Ft`D3}Mnsze Ia8rnoSk6 tS4WKrԕl\<"|֭_6.AC*Пy>4pԟ~trtXz{ڏ255G,\=fhGꤶ24GbrK?)( !e%>+nisvӆ6|yPns?_arr)-|]FYsLTI߯ 8E#TS͢xR@;&ew?T>Esxtv5yKo%1pNvU[|1;]۶z;]EYWs=]L v^渵f,䈞zZ}6QFNguv=ф=w'ilE" *Y$2(_4P,hbqIII,nW$bFR&aH0253sqvnomXYZq1Ct4(j@>Vz%ob|܀DDB!_p(dr΁Ҭ!}mI\xI\݀4d2훿M^^tAQE1 P /^;t6۸|`͖3uc)`@&o7sAWU 4Fa(J"jbtFRoh8 [a3ȹU4'0T`2QzLT*m?:Cm&t~9:K!cU Iݱ}Vl]FOgEjt֩ ٣/DNYԞWhA&GgVYw,+.n7|(**}@ tww`A6 цԸQ%D+,"f[Kʌ^ (>-w9jܟ8xՕkwF*Zk\4=5EԀ2gg]~0kL/O_~ɓ'۷m[!iuV<&`DGgEb"s0#um1)A|)c?3(e4%SxR`#U(-%D7Ftx//(TWcυ:% ex'v$ T0#aH%<_?8^ry; эi 4!WCSÎ*nAi~&t04SL@G+ʒs1FW۠l?_ fyCa?(ڭi~-2gM:uw֮]]FbׯT'=/ȏS&O3~m۶+bjRBRu϶"F*K E#ur56-S.W߅~a%Z­|PA_QR)J6*.nCJJ2.O{/ `ĬHMMɧq qu clU"Ԑ j3hj1JnP5=X|1v~\lS&H&&!WC6j%|ئ-@PT2j%a@?ŔܮlkupQSdEߒTx?Ϫ^l۶m/]V{"񮓓SII ѣkV|=J:ezb%Oh$pto?JB'md sqo?!k/ Itdcӑj2\lYQ[EVۄ6lS_'Q&,]TU לj%_LVVu-,"/& 999D~3YFFFUUUm\qy]3~%h8OYk m|Zq;* ?x(}GvcQS&7_[VP;c2[tV&dPC)d.$ zW=ۄMFt0ׄ+ˡY Q@6ׁM3|LnּAEh$JleZj*uܸ#?~(J?~aۊiSBC=S,2*jnnl6;t޼kնtVo"m^]nP»֢asth't!cɗ[dsgePHh\-cǎZZZ 旿+̶aE&G'RW04nA+̶٭UN"G'M\HVeUcа9:s[He[[aMBǭ0X@[!DիWZUe'կ]o>](//755S_NkYXX*q~g+WD_hggghh:o˗/pCj}vjdui ҍk015rD?.kbbZFDWĄJeD-**`edJz+(q+ sz600j2hȯgeeUׯߨ-GSϞ\C ;|kKB i,Xpݺwiiiׯ`!~s;wEEEK.!^<*S=v츺V'Xp5o޼)?.X0_uS:uⰰRׯg͚ Ś*e }+%yN#·lQ3n6.AC*_~_͖GFֵ2[^i ʚR͂ nj:8xvP`*kRߪj|}{}oi tئEӿpũsjd2q˸s+*jkgw!KKF`lq+7h@ @o@P6P3n ~9X{TZo@?Y!P}Dj ~%\F֤ę3gԖϘ1=))Aiv h"['N/>|`Iק j4HV:>u괽 3u4@Xآ6.m\Msr2ɱĉJKkysZwamDyei^&jbd[!A:}䊊 |<%9y*񓇏ƪnpsyo޴mvEL .xٝ-H4Qh@ i 4Æ 'IIÇ0HII۷ې qL̊T\~Lu,,,-,,׮[GWi*&"[!-&5dܱcFϙaءSΜ899JJJT7ѣkV|ŭ[;Dyi^ 4i5[!-&ť[ngϞ9{ ʊh?''PƌgΘ2UqIil◲U~~'QyyIRHҺݚTV@h];wڹ+4t.5zttTTiiiiiiTT1c5( AY83feNCaAӼ6.jуQi @T*mm%hw@9':y7"kVVV6m.\pMvvv,8.VWW#Gߪau9} :Kc""=z92**Z\ VLggg:3xȨ%ucsnܸ,\m۶1Gm۶k{Q H$Imzߪ-*"RYY٩KWA$ R42UB]oyݤI3[(diǏvexe[UՎL.'WkT0+PYYikg @՗K!Ql+hDx+V6:CMP@AFuyѩ_~~'#э VHC hyED,R{R2V{P->*,--+*Di>^^LLL/lluI%dUQqEkO 0i{d2^UPP(HPfwWif].w@,B ӓomFog^վUsYʌ gtcԘ޾m5*[! jLnɰo;l<2{E-Z9`Mts5,(ѭ#ɷcu5*8OFx0 Aey<>b(},l''7Kzc Z_ m^DBL@HM6:}+D`îNX(L$R_a( RܠR8?^ȨNZP9D!`i{P9N312@@1u`\IQz6* &Ւj!*0KňXdjP<–'h [C/mRQ\FC5{/ss[ۙ@"A)JivS},n?w$y\sK6JP2&HBqUU_U)0DT<랽<>|2'81HϞ=zӌ5Zpr3ƵCqih@ A0H1ede \u6n}#XkOBF9 V-!PE@(*cFҨˆMrפMYHVeXYZٽۭ[Wk+K<תX,?uǎAE;Vޣm}33_rDbEkߴٵk'sum_G;buBG͸WFWT,p3^mE֙t!655211ጴ dϿaQѾ0 έ,oxlDZ}g0b2t`19E6~ߧS=n6HHPQk5.6Sx;wQۦw޽pYAAAj/o߼IM񴰰tIIIѴ4wwwIdtB`  1K3n%xxAehbbdjblfKD—Wv흣?OVH5f?6g?_@]JKtU<w\\\-ﳳߊ Hqqqnnn@lC.[շorrvmsO #[zVx8';gU:o9Ogd??n72zEnNv*Vֆ3*:a^P(W\ԩ7ommU1hOEEŞݻS~+=ڌ VHd2I$ox0qҪ,[!&ԥ:IJӧNw^Yួ{N [Ź IDAT0Gij7)N'N@dM B)\oߦ6Uk ԥ@GYO\QQ$'O>=vOE=~X N<9xΜ7o͛mۮqO=CZ#gKpзB äR@cR67Kҳ[X 6&%%>"%%H!%%Yu;iw0 cc㘘̙YXXZXXfSɧgpaJb aDR(>D4ԥ@wYC;f9!:x0Y@II ɩDu#=Zf/|>XZ\\ܺ@W9n~7z}+Asbmۿ~iddGsss]\\sguqq֭ٳg0 sss۴"Q2ʌ׬Y##6.θ*??ד(occs;;:]rFa^I6)R @J;;{ATsP (jmc[YYCet54tޮv:=::*4**r1rU t,^oPx1+W(p8" ꞪNoUhTtࢳ^3qs1iGCF[! 2,cjDV?f0='Ag25)hcw{k'%Pa&#ܝ}̟@b׮n|6m:xq*xe]-!a2 $vgΚo0]wڽݻ#Gr2hѢEPQq2@|PX(-X J]JKo4<2ơvǃJ@\^hfԏK+Vߖh&7"0D,(/$ R~- - bYJ~ڒͯI\s"aj`hAY Jzr[4^^"pȐ˗G6: VyQ}qUyyUMZV=#ߊG4w!BZ 5[n,=p@d2 8( X,m8okr㩣A5ʘ<;8TkitMǭ?ա3v~E"BQe%B!$"b(:~8nM<OW {@ JP(d2 TTU ߼BBk|h3OF0e*9mlXLCCF1dEzWUU.0D,s9$LC)H ZsK>2Q=5bFG31piK3$CBG0L rϼ C=t׿QA ip0|jbrLYl6ARd2AP!LqkG]H@)HM29)cٓTD& DfP^VjoFY6RE@ ix0 `XNɛ|雗ܽLMMt:Nߺl$Qd L*]uܴ&6HnsA1kvˆmH&|!*}8wA"'iYŒwOS{sF@!̠(h_~uUaEEZȨulka VQ!83!4r\<|$'w|ʱ{,…/9h}3H-Z"^ 1q_v'qj+*O?M;@|2KB˂.1E!C\AeYm<zv8#Y Eܹsl>۪i>дkJe\\_WΝmϯkyYޗ4A<&޲hNDp#RRO?x"+;axJR6$Bv*0'Z b/?|5A0b11,ӕ>Ciiofɓ-}qUUUl싐^zիWO8ɰi  NEƭD"777ùsΕ+W>ޮkGWWj(*n̘1߰a}ǎΛw1j9ZWWgV߲eKxXӧO}}}.|Q.cb>Z (0.jΜ~e%0h$I~"9˖.߿z> {j_ĕ;-}®b;V\ى|f}MdX1| mBIp)-g<@[X 8O@m=j:`XAPppdמlצ jӴ'$]qe1h+AU LkW3ϧ3%lsH4sfd^^>u)S^nn&MKų6Mk NrZ%NFҴ ;uvM6uݿ۹s4+4x۶S 7m9v̘}jVY579o/9s䈑4*jNAA>hTm6E%oN<˰AMN:G:rVhӚ XVѨ}ַ~A.ו*ą'NomU g4,@mfj*P[f[ VV X`}v/M5KNr.Ro'^_gfe+9+tR44|d#XߢӢEsrrW.^D"~-r9vv fJ2VHBmmذߟj-@8MUU?p>Ñ'O9Bnkcp۲c 5 ܾc'pޔQ#GH#"=zv 8K%nnn;{yyy9;w m+yp8 8cZt~ifPyYٖ-[fL8ig VV`&p\`i4=Q(J݄Eq+...yyyyyyՄ^{'˖]vɳ@+`j+OXtI~~JϏ^tĉy7/\Hohh(/+۸=z, 耀1opw蠠%K?i'%&uݻW/g V;U [;C~zafʐEgo=ϧåoiP(8K0nAmAm;'堶kWuw8r䈜קɖ~unC{Z)thW+X *ÇGF4uw匌%$${K ƭJPH,fϨKJ‚SwL%~MX|AV\^]]}q^,6>>@;o?|Swbp\$iq5C !6l9 !qv9b ( 0 <~fƭN7@eEK2#9m׎=+-E h#2Y=<<<< Ea8VVV9YAmY]]q]{`3k`VLtyDĴ}R\P[0I&_Ϣ=|xI&WAmV[Bԩbvv1u >##]`ACC:M{lBr|N^^ںuK=7g5uGXX3o6mڑÇ5):ri?铧\ʸ\8)1QM{lBIY׮OKt9s?p)o3OP[{k׮ILL_0`b866.55IS~MҚnnnvvv 'NܥߚWT"淶wr5jfvu߾ѣhtO%IRҚ#GDWȪի izndry\\L&stttttOH-F+A -]L31jHo/OG9sѩTW.$^$I>|DFf]T*Rܽk>@x{{ՂwII }OtuOOO&=77j˯']vU(v&]cV`U'' !00!$HWaaaiJW%IqquHߞ_~Z*Xrذ _M5v@mV|[BQQs}mۢPKƆ-)----- oF=2 yMN&eff"&LQ]UG:nxЕW ;J[~+B(ODxh>Ԓc%${i=[[[9o̫Lykʔ #jk֔)o# MA@~+0䷚6577wIWf4ofkgVW[ޞ z~)V` *u&y啕ϟ?1'i毮QaEԘj+0y~W߾}vppX,$}4  CE GKGpFݐ8;˽߮];K|O>IB={?q[ڛ깮>V_!i^ 7PVV*H~QMuB Mjw8\.I!D󂐴KGjk:T{v1匌+Wܼqx0&MQ)!$ ~Tְ *H"D"JtU󤨥flz: $k͟w^% SF$IǠ9QUf."\R|"`Tj._돚3>gUdUJnH񒓚RVaC j-"]$Ir~s2jN 'O+:#e2A,p`zQU]-ťZsRىi atZQÃ2՚6:ؘ/z66o\jXbiN]8aXMMa]T*H$rM(l_`d&YoJqO$ ǭFV 1V;>QHQ[?+ПUD$H6A#IP[bj `H$IN0$Qs$`4͘Fr9$n$A$״saIL II`[k `0ӏ[BIPZV$ 4gYԌ/||IrM~a\.P$i `,.Bj5rM<ߊ0@$IfhL>'p+aI?Dq`!H!19XgYPZցfe*la>P<rIDAT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$IRV+J{c|>0滷%n,VJR=<ڵkoX fQq VBn,]H!v..Ֆ^{W4M0aL)0pd={8:w,Sv"~~Ix'tC[v:v;Kl1]-tmqI b70faӰ mL[Q[[OfgF gSoXw!;7+޿f27'IҮnْŎt=G oѣFwmkG6Uev3:#Jᵕdv*qzcӏ>90|/B>Ѵ}W`g=zV2eIoZWXYךY׮,ʌY~FիWg͊\n+^aef ee G$#%u?Wν{ ux eeZ\,zɒřYYt/,cK12|@!Psܱ}\l!+|aN>Ja٣LJ~XW[h]|гge=hQҞO _"yfgSmA.NϞ>ǹ *cG}}|+/]`;vhgΜYdɶmzdofiWl$\.NZԳ]gxyKC"'EJR$qsv\x&i YA=w(++ 47޸C-W*}ݫ]+FM&A<dV?n>; |k=! =,U <.Fdǎn?/^ ɍV@]|ĩSgϖnެsh`/9c†e?ذDyY[{7>zojjV֠57|53S8p`ڵ{҅ݛISw]c,sCYY;w«+Jd{z6ѱ]]-dfe 8Nx҅?IJLtRFwʕaÆR˷lz?7ѣg~ӧ KD#NgZ_lQ]gBBɞ[O?{VM>WiͯkfCڵ!xѢѣG'$$hZ|yv+Evz2ztqrVܚ/2s J ʳ]E*XsX\]]7zxx0d1ܽm]U~ ӄ7'9y$W}zIkV?rj:Z{4Ncmh1;W֬ܜN= *++޾}^=  >N<yȄx\{_37unor0nλoc5ĥrdKAC7n7`naւ8w~̘7-K.0`]]]]޽7%IqQT*վIex)h|vlEBAtmm"H2:y丸E*ս{,\hPRҚĤQF Wa~lx[ 6۷2|Qhp>cƌO?ϋ.mܸ1bL]}lؘ1Ӳڽn!EB(11 ޸cxyiizt0s ֧_hP(=744?*GZo;vUO>NLJbX"Z3nգ<">S\A# #I N>D_%%>RY) 5rT}}_7o6XC!>d̏ g/9>_LZ Zb'W>ZrepP`]}<֬YnWh̶ͬ_uo_zTϕOר^s~;o7#NTm^|qkЪU+׭qGի$%͟ťôt5'Ch_I} /5N=@\*`arLj9l]rrͼǡC E-ǑLTj0X\ uvm}B''GN߿ˁAËCSC!aLx]~[ڽ غu<+d?p"n3m%ں;bL)лbf#ݸvVTЯLY]UYyy¬PztĚMHϳey|Am]=<<@S<lZ;C_C{{kK$>۪o:v|cJ޵⪪S'OCCI'2KQi 99g'X ؠ)}C{[ֱ׊!s8wpnݺuEZ0gvvv:H\]\p7u_Cm[.#KA=o߮\.7s㸭-0!tCm[.#K `&pЏh`UBn,F eY!`[K}P[}P[}P[}P[}P[}P[}P[}P[}P[5ԯ"Lv EQ,LWJ!LJ6<!^hudE7?2Aaa@8)p)br>N8G8ϻv0?u#rrrǡ.!IJH4ƍJD/hU:;+aI hdӦMzX.)i85? >_YwA4`YhňLV%&eDג;? nDiZAFo1=S%ބeeڵs?qBHVffn^^:uܪex<.,1t"-+QPK\(ʆzE wԾ3p1(V~[0<J]HqB+w 5 ŒȎ ! E+\C#϶ @1ї7ֈWJ =L%/4BjQ&h.,Y17/|z!A9` 00Ihp>@]Pm1EȎ˖- ;UIܶ)$˲**v$ҩsV%m ,+ ر,qXnUŰp7[ ! 6:l*%d(IV @Zm3z%.VZϏ>ZzΊ :~֡} #-Zı\]uj~ V\լY߾ZlUXXXgOYٶ˖͝ݮ;O::JӟXʸ  !}+iU Acǣp2N yㆅ(,M$FҖ?1 :F0eʶm]ҾCGG =MfQMF8Cio?.xUUW͟?w5gݿknBNaQQaQqǟv͚w;4/(.*b [qǛ- h" >|r\+~tRG,yyH Ül AH8ȥ/B=OE#pRh׶ [m֯ߠ[ ;pPftG ecb#@)CYH o9ꞝb3B(Q!|o3X@y[zM`XVV֢E¢O8q5;6ka C] ?k2!M ۶-$By\PTT\g[ӫ_r@ P`8J ;DLEEnD!|˳> oRE|5]RQݲ,իW\K.)--ul[k۶ે_vXT3qu>k^=555XslAizN)ӟpŊ"Q"N<Ġo%&AK,#;ء֬ݻ1=}whw^"T۷o9֔/ڵk۾};o={tءk.C_~%X "Q:M3`c TPlLJ]e/p!JJE4Up?6Rh`A-*Pt_Ԍy<HU Txn hU~N(f"3xװ=3jP̘$)A8+W_~yѯ\!_vOC"L_j+۶ڦM&dL>Nwڻ.n~֎,XGb,m! 6-X ^7JxϮAb E\>n_4L>X",)- "/,\5`1d00%]R]^ Z4`YܾӞ?W<f~˚`Y  >@*\RJ!fPo@  OZ޽:`㏿;9}ܸq> {`غ5NeyBxD/(U {4TV6 uvxrVEQ4-Ҵ`rOŋ;vؾCǟs]w=_yO?H(Ӣy OmY~PoF!K/Ut,*E`' 2YPJ`՞uШnݗ-]R]Ue>VrRFĉL?3,_R:7fvYٶ«nuqOΝ`Ŋ)oL8 2d`<~q%)Sf̜YVojN N˲ڵkуߟ>}ڵk G}WRǙ:u̙3mZTT4x& ͟7V\I)޽#{~Ҽ4-yw-**z׏>qNxn„3!:ok׮cnַoז g}/yW^ң9 $ҶQn6^}۶m-..6lبnf̌M}=Ǟ={m:6lY LZUHɊR彠gmC̸^bĢ_E_%*Q4h=tcKF)(e%baz򄀼m;^q@ 9 .袋Y#?(KTW/AU8nٲ5 l.)i t?EDTI˪6姞|3F^wmo8, fc~8G,=jٲmc<7at䈑+r;ӝ+SRڎFt"[7MWPڪeKЩt>˰!UPi<%QJHJeq?GpW_p0e'd.}7w3O?S+~dSLfse==~<+Z`!c'||w&-'6z>}:mLFFƈ#ip{gVfYg6yŤ9?)U"99oQt`mlIV㍂lOࢄSC(5\mѨi1';| hVCR4@(B!($@x(@I@%5Y½5M/I嚻ltJ),Zr0tg„ ii[Gٶ 1|\8+IJli޲季o}L8+:qw1GTێ{MDX~W'N|u;~,P":[RekN9yAJf2qD@:?hR?Nܓ@cdyX4 Д)Sӂi-bX,Ԑ4irɥ)٤iS3|v8ⶭ[N9 8sqS ͛@zz: ZlEbs/Dmݲݺ;Əo#8 T">#?) G}3<ۿeS宻zРO?5l**+(((//]YYPP( +^4oтOqذ&9:?Tܰv$}~F=;ihC2y7[HyG_HE,4`YnED!Tη@8$X-1׵{dT%bjB0;.\7֯!ZE(BYRbY!;z ~u{A(?)~fmC,[%0\yĹ`Y`XY{Ί{m6,bH #ii0lp_xqyϿ㎱W]uRDŒ[_{m8lpǡ/y/**2hB=3\]%\NOOg_y{SLf5,!L`Zz,>ȀgkYQE`uR_P@˓ZM ڎtFV07'דɇVe˖+8b@H-lW_*o׳ -'g={NAAeSJRVk-Gy[-[n޴iΜop kjРUV͝z䑇]<X؈>t&Mnj']z%kn?\mLrqKpz>ެY.2/Qֿ2^ϝ7`=dtE+!MYdIP8A*Yy$cJq+iL-#px AGA <1LһlF#;Qj"z"(ڙW‹RM-ȉ`XSSפh(777loSQ 7:uE@^gС{T֌뮻+q5 !8r&,,7k~XTT$*:tcc! &3"zTWWX@'M4o򪫦OK/Qmh5ug`߫E~1#x,$GnZ#l-ÍbC-)C!C`اͿoސ :qٳn_pʏdSb_7M6׎?;vTVV>8 E~_S~ZSN=zVV`E_z`0{yk[cr叢ġ#/~s'Ɵ7 rw{o&YαcP 2S<9Yf > g`$?E˚޴y#B@8Pp$RWWW[WWéj?uKIip$;6 G"HDo\8Gt:E^,ukEQvóH8W&8'+[vG[;EvܣX<(?Tcrxm۶>Fs;q`f2'H9([@UzŶq`;][[{뭷:Ёü\;bo;B^M7p-7;ʗ6^|3֬BZl3Oqvܹ3AZ6bĈдO-==knp#v)cn 9tX~.iB1OD!ȅ_De69K29a#O|zY'*2DGrUfϞ WOܕ22̟`^{hI tRNGz^u5=!Y7$s(J%M%dxxټ2;^&pR,u's* Ab@Ć5]uvMY]u΁8?b>1L`ϤCq˜xA8JQjX} 6$- ({ uP"J`cDݨ|~D ,nd5Pנ`-fdJWCB C[0~޽sssL|@)H~>lAX`Z '7bG9!b͟7?Yf̻Ur;JZ^)1_`Dv/X)Dx}-8L/a`f$i)!$\Zj>Sέ8"JgDv}о!dO*-<@Z6<$J ل IPs< R#\ UqﰶTT藇 N=_N\OӴb֪ bNhȒz-ėF2x_̕Z7M; ĆL ̰I^TW4 6$ZBJYxsյ@QL1,^˜lFNX:rO]Q4.VO;w>C!(Q0 XV=bhZ0( i: 1DJD$lłi&%&HX ;(cd46XJ1PJ;u.a\\ #}# /?!<[!}OľxqȽN**v|6sl';'>=-m=zϏEc4(6bq5AQK#t/ƞuU1QcK/cFщWNT*c'Sh:GG&diYtTˉwc ʷU!M[ )rqDD 0-vy/T-g3e&G,rn^eh$kŵ2"4\@^lHZ$$q\^zb{;=pt 5 cRs-+;;A!<"$NKOoPH]]"²g+a4HO >mKLTE e?[6Y IDD5eթuCl k‡v t:p^cax4g:g"0}-%5>)G7}) ;࣭q,2 ۼZTq-_ -wh ?d2eN8nF>XتYYcR__F >MHEBYF!P_W'7+L,De N Ou<ƈl#jjj1cg:G9- R]`S22B鹹yyX,VWW>IGF[1vDf Hq<;Bms] L0HqM-PgL1ⅢE8` @n8;׋*"0C#v-nŵRweJȘJ _V7\x Sg)`y"~cx"/ r~vDx@D7x]SAEF2AB0VIk)f"x}!aOByyMX0#H,h,p0T4bwBP(/ x<\_lªIW&Dx,иB“]k>O na  P( rsrss E#W3~CPXR >XQZ2:|)Ew]|j!ɔڕRYɓnoq6~?b/odUH1tT膒#ުMEZ8J&\D ]QK fݑ `rl-ZE ^5+]Ety,\5# P ;83(|lcV <$ #$4R4qh'(s;" $뢨"9Gbp!𡡧?Bʑ̬ 2KPEql1dBo' k87Ťga۸&U.Ԯh;9^i&Il-2$OPd38x=[$e|-.AʋSڔ#9q&*#s* k(8'w(fQo浒 ‰ 'kHQRRëuSf#0 }4aulBaӯbK$c *izk(SaqrM@Dbp%ϸ'q$8`L绗ƾ@#}l<#4r.:xIt0U4ޒV h-2#*n$a6)``f+3] *+C(vT 70!`S`L! Dus0(ԫ 53F8.$㽉o+K e{&y H$D<㾞oDuܮ(Q6}p4WLyqBGMVb)ӊOG3@/?Sh Ϫ1 r$ Yb3*Jd?&A4l%-_sn| aËN$Ӕu1euHnGwB@"W dsR МiW4/:ƀ3qX[Ś_s$}xfƻBAC-V雤G2(f7e5'_*W@ !Ilz؆Vgc޳$Zp OBTԎliCAUhCh'&` %-3HG_8iL7V:DlH$|vy |B(*$/ #[V: C'N霊J ӡ3#)Ik`3?9/o)4(޺I`'A%ei:Tw7( AJ} [FoaEJo}? ScW>Kh7ƙ<fn]/2 tm vVB;Soo"' ȜtbSagd[eV <~<&ޢ.VC6L?/uD+%Y1bᔊjCrPV p)0FXaR>_Bed E @/o!^Xm)g4/)B2Z|f_(үoulK0*Xm= ڵk?TԀOa-ր s}3 xPJ-ԖY[q]1vNI'XPP CSx8M*1= e8Hǻx5Py>^AIķהX!?\n) Ed3n~NN5`o4` *z;O |΀*@{qK2v?qE7+.>M9UF+*~# W@U,ZKii~~>"یsy{FߒDK\\}*ZS$Awl譖 x/t3oXO~L!U\%dV Å|> y#S=|#L]b^mR"MÜg4:F:)ctx+K3WxHeWycڵk۴iso~4׭[ץKwT? Е&^_`G\yt*FM4%)jL~UEO9腘!U^,iW!H3M)S^ V(E7*M,_Y-!"Ej<H>iܒhQh4\MnyB%϶a ! - í Ys X͊6\j޼YUUlS~Ɛ*aJ<%@%K'ٳ*5Xkʑ(L)!9 6v@9^Eh;/J P +  Ŵ _!L,SƳ-$](3\'gkJBBO<=6\K އ!5:?<)###''' "IcO._xʈ4zL| QB+QM" yw:]^E4|pۉ',g$ZÊ&TϻKa,ln,NzK 3H7#`+AO52"imh1?O4Ѭ ^b%rDM0]+ hNF8/}rw_47H/PF@ g+#E Њ}ug@PEƒm@P'(.<&_IxuJ{Jx(C;< %Y/4'gZa:$?;rl+jY(| f6N$<2QO Ls8HVB٘k^Vmg(oD0?cQ8c%E%e/# 5#!GZBD$m7dڞ!$^r>Yi_"7 @1EfLá6֍ð_1)$Y$ö(7eK͝;w-5R8884ڴ!'n\-)VJDp/&uPTuP L7RJW'Á}[]kdLf~umh]o߾ݶ͛7[U\\R۶mۖQ__%%%PSSno:t,r6Gun1?~9,{bǎΝ[__Ӳe+&Jt҉K*{4Bx(׷.++/ l qjh\R8({ՍkӘ&~P^< Uh%z2TژZ6j,_J(8R=R 7C qb P"/P{!R-`%Wp IDATmn߾}]]]^^^ `l.))s'< sY>}MiӦDLyI_YQ[f쩮)lzN( 0a0CΙ3g„N;5k־D|WlQzM$\23#xc,ff͚up[꘧(4/iAʰ44ˣh1)(DJ/ w4"Dv1M$!*p 5MщaLϽ襴t,JEc0G2A TژuaUUC=Zrut,* iZځhpdz}j*1] dRoaGEI쪚쬃/*it޼йsPΝ~Yqq|w)+VTTtՠA#,p\²4q-7Femn]@,{?p8,x0^|p챝V>:w6"{n=9β}}#B>tҤI+.gbX=kt8 {s'ܓwޝ >}o]VpW1.]Ff\- T:2K՛o(#AqW3 )$.@{"2ZL7^"$AK0ZC5^|Uں8R}mVݣԗvϺڹ3X</5BPǎ,iashng(K{Ͽ ~?hEc) RN,I^.\q7ryoȸ!^xK i<z˭YY}[60bȌF^')2?X<ޫWv3'a2317 ۏ=/_. >< ]s͵_e:0Fj)]d\;BHŭcv h5J)7gΜFfOG̐Ɉ@J] xd5NN*!ABC޵+ IbR$S'_Z'ᱦ|DVuWu={ݝ;WXm[^l[Y|O:lUpB|0c]wV؏jPZZ>m5u&@,Ѧ1#.7X"^Ӻ(,}+׷oO>a ,?y MK|v Dm -dyh֬@;v@Aa!((,5d^tќ9s>+.BLNWx0hu?ªU+XJ _P;vPD.*,$09>5kF)3m݊k5\erYB6?$35m^)d[cM[^*n ڦ"l܋~B)i]D k6mm;==iӦ@uuu֭#&7.};KЁ#xH +o;}:l;{PW% 4mѦ]6&΄]Jt)2ps=́͛oٲ/WXP \;'rVn۶x"{^Vh۶mkѢE&?iz;ݽ{7rp;w*.*ڽ{70tT{BQ󋊝;w EEE@Pzw﨨xN;unݺR&4Jy[6o5K{>ppe7dƣ+' l$S =C+4N,lU .() X,--q,6>b˲ڴiC,+An4kVox1ˉev펽iA@桳:Mkv}2g1~!ȑ#ܵ+-[N=46 }v_rMVNNl޼Ilq%|1)‹.7OD"&O2p;[xɀsPJ 8LH8< ~\tE0}ڴh4:mT˱zӧOD"LC!U49up}S)tΎ>頻={M7rO~',\g#4_:6~ϸ%D)١[tQV3:QRU+ iq%K,Y#*l=ڼy֭[4kl/^lY}fq>|tEyvJV%7hqVp,3@ZK[dg{_߿X>C);;{„g+**xӦMx;٭C2BoΙgJO?tkحQn8 . nz<nuӮ;g̜B1!@9|#G-*,z'ƍ{bȑꦓ|-:M>[G_wul7kiӦO .қFb '+:\tA)Œg N>aÆKSbB ْ)׷ =^%.tJRF=fMر`B0m޼cowDp8 ?gأEmի۵kwT6QIu&+{M}{u;l.k$?go=CnWemZ(Ńf7lX~}bZ{2555z3g7k:;pYWWw=srr[E8y 1'C |]~2Kl" Qt Hί<;V-[w^uuuel/:t_qP(D)?A>C敥|/ ?SJ>nmqxyܪZdi^rg'e\ٗ(<-7ߒk@`DobL#C>#$Q)|䑇o 9G U@5OhVld(FQOF4XKeOv D~H.7^bJ$̔_h/:QJn ZŞH$P,0, ]}'~Ȳ(x| Z],nLN1#R"kf͚_{͵z JH`ÿj@BJKKq͚5cI**RA1#eL :UbkC>jlo4J.W 2T+TKx\KT6&;m1Egi}nس͘[Fr‘XPUU?UImKZ_Bhd|%qӯ8p@E%K-=P~ۈ*wd*klҖ`AɟQӷ wϷk&6ISt}O8>iagRc=ێex$"\WkΤ[~5/Nz;z*(ɼ@ )B.A9/% /j%{L䍕Lנ!T0Sr P%YmsH$3vf~O(;#Z0h4֥y%wO?vr&_xvxPkdND=NO& d7*y/w!s،gT᨟*)Qee%48tӯ|K >m/&F{"w?osi߽<=)(e #?c$BEՃ!AHP7-A)MQ}}m,˪-**D"(eee`³X,V__gϞgsQҧKEMj"q+ɣѣr+η˶>=I㞃?#X#%[S1ߧ:I&m~[b\RX,}T?r)oYv}l=/n,&z۝uq{}y46gO< Le0*{Fc5f$Y1I)w"0 ca__`=kٲ}! ϒޤ z>=NZvՖ=:4 dP#G;v㢢@<%ZDC('E):4ԡ}6lܻZ_g*^`srv/H̎EM tuLQR:B%Z:ԊG?xNDzʪ~Y}8RG(5?9dMS(E.ciiilc?S>Z[y{ef: k(E):tg@ӼPZpyg7W`qV|_V>MQRl:|3Fîi{ީyZ,:{W>_zLS(Exf횖vΏP~~UO:(E)JQ~+tقチ_R)JQR[l3kCDRwv(E)J?ykR(EMڋߧN7E(E)JQ6(E)JѯRx(E)5Я ϊ )JQRC@϶o~amռYq/Z:V+E)JQR$٘1_zW7m;#;wT_R(E :x6p'N:餩oL(/RnZlqI'>3L/1^͊{:mΜ9V4s#hyFS(E5m9ѷN>Lz|={]~!=/"^bClSVZu§ӆ pÁeR!O?S\\k׮~αc<㭷حɓ'wݝ9jM0iҤ}i/;;s7wynmLff1(E)JaBA [A} 3盙3gnذuL/wvuuMjj^wPU]ۇ\_?L` co  #[71iҤΝ Bq-[w}Ou zItر&/0KQgnѲmuu 2c̬͚d.E)O>#IVXOڶmۮUQMMM6G[a__n ;tOzK_t8ٿ*Nٶy˖N=.'S%fff~wKJ0E)w__]%OcQVVVWW0B]6Xrp!E(p8Q?tqƧzjϛ(@4é_L/~G=znҲeѣoPkX*w߻}{YfVLRElРA ~l?áP3gΜ+S_p|+m?묳N=}w_#zgٷooNgJ%ꭰ[] h4c~zOFB믿޷o/'O|?{ܹM}cYgyi>ñ+d˖wqG޽z1ѻwN A?Μ1"ȃ>pi}YSߘ*ҥ7<]vI et)}ソ^pAV^cC?Ě{cƞS@P qG+G}jOfX=dOQ~!$~>pM7ϙ3I.N<W̘1ϿBM0<ʫ[v挙} ;EP^Q|m{K/(ڵ?ﭷv[Gz~g8.{PjhāZVUGՊ{~;lkց[{2AV8! B ܼuk߾{[VVnݲU>~ƍ67|P@F$FoNN|&,\LT/Jyjhnx\*==3SYd)~<\.ٳg7>>ԏ y2iɘx<222L뫴K  %K/\ fzWc.]P o@d#,FZAlׯ_AiҤƍgϞfܕ+W<~7n޼y[n٬3))b%jrVViͽXJ&%%{xx8rJRRR҂o>tɓ'oݺuES9Gw:}+TM^QTiK9IIv, ;޺~_|~PN3{B0JBoڵ_6_^n]_͟?ŋFH'jO>]rUbkyY9`[vT!TW^ׇjZ>}z;v6DPoۧ/Rq\.rʒrݻ޽5􎈈R "{qGQ'S>;6 ԏY4eTo''ߨPs P><&7jY IDATh„ AAA&LhܸI_Ϟ5cǎ6E.l97-BC'ua…݃[:14NÇ8P!WP+,Y|.]7m662zGlٲ7)S==2/ٔY͇ ҿwwɅ-ݰaC'NAJ> L&۵{ڵ & ¾}2dH,(d6%L"oȐ!ڴYf~ˠp@6O稱%'uw:l$(i!"Lhܠp|*4*h|J?uڴ?ՁКh|EN5lpׯn\خcBk x1/խ[JT 7x5w| ![`WS0/^Y,j tBf^x`*|i4\N L{B!Td2*>Xuur[8 RH ,fsrrsbc,hHB|j^{?ڵkqqqϞ=3MV-IU H\,A=[؃dI$YnSN5n?>|G&^^#wM> J%?~|͒ EbGPA^/ػwo)w@^q*6$ D"p8ԓ%"㡋HC|VicdNdfVhDR`y<^S`2RE1s) 88X.R<]d52Cj0FiP2CE[pu HSz]Mlq7V`tTQѡ R3ѫ}JLR ̆DAj.ƍRbf~~ 7iz0ۖa޽eK``<JA&4 Haʧ.߹kS&MJ2xZ;T(][l * IqِBl6dcn k”_in&3.G~j'(!HѨ>>@$a޾} )d"+אqÖ ;i1͆㹹9MpH(_A\X,.琡kPHߔ6999 |Wǂ @(8 3jF|`!m~)S :R#v͛ǿ}r+9M7noּy%q$Z` RnD V%I;`p+rs+-D?m 6Wkٲez^r.]teժUz hժՑ#Gۺuk{6iժI[nժuxٳgǎ/_n(8))믿ܹSAӦMSzѣgÇYTþ}~{tK.رcHHȁLc4|kF@)AhufF7rNBo> ia<>T0<7W^rɑ%OjEbqvNuUR˾JL?mJ( l:)eFFA{wncj^c3J_J>2pS2  yaح*3qLb3B3@G"5g]zYG`!ݯwS-|іIfb._^/JS$iY 8P5SԓZf޼aC8q͛.\0LJNd׮]Ϝ6q%J߼yWsYfZZ*(<==M$d2!zp8'KuoaXTj ~@nرsӳUoKݟիWxxeK |޽{[lXjkla%aCx>}:r- \n%KgKr]CCC8ŸqлwȈES(kQGeggo/(z]p $.)j3؈8?{UxOe2ŊM=@ WV5ox7ǿr~ʔ)k׭ ذ>tȧ&gɓ'S+/Y!bL6zSNQ'Nq>N_~i^L&۵kWhh(aĿɓW^ݯ?@0bĈ2xW޳K&3v3gK>իW_ =Kx @+]X('}]cC֞=C=}N:u߫[9sfdd$| {@0nݺ z ^ iIrxx38 /r_E@{Y|||zTӦOԵxFŋ:wj4F#\#6._Xn]F%>gϟ/fHrE+ $?~ܠA&9)J,6l0a-8P$huf p|'=z41he/p8-ԭx`Hy(ʏt 4iéqL/k2Zb9/^g#>su5aB .T! A*͉_Y=,=m ٳb2j_T*V 6MnIQڂ8#`0bX,9yTƍ\,.rooX`0-jgT.XdןP#3LaDzIebNA>T*1ѣ7ntu8RX,Q|* Mh]۷ov 0puA`4lܸa'F`H$)j NGx"b#X3{҉Giٲe˖-] ؄ax<. a''j HMaŁ oDA| T(! Mɼ<@as LJ}]jX,Թsf_p!??_":W"tF_-wD<&ɆTE4gPg [12Rm߱Oٳ޽Ç"AjU6MestD%\+a$ > .TSmp͛7` H*(p+AwΞr[sٵ=RTyww]:իmv!!|||\*j}9G Rt TI|?/e˙;/;l Ґ*j1 [D@)od?̯n⃣G4Fq )Y?l#dLe(v_f50F&)@O_#UHg2/O>O?-u_U*^}whd5J/ʌ[z$wz%$$D'zM詙?Q.CY|C/?ۻj׮=o_}U"hiA*>|rtAUlR375 _:mze BÙ3wגSS\6kl6`FJ ~wST=*%=\Lh~ ֭[UVuڵk׮W6Mgܺu={t֭w^o=zQ٬z_8p`GuG߯_6m;ޑ;UPuZsʽ?#4/-RE44K. 8 v{Zo߾G9z\.7**z;wxѣ{jZZYrMZ[T~_MI}m6晙WE fffa"#"wd}[sܹn݂WZ]ߏ=rȍ7J8R F$FoNN|&,\LTlTQ$I41 q\UFz:gcǎ͙;W-O?XoןΝ+ųft`/N<9klT:wΜN~5qD>߯_F_R/_ ۛ5ǥ̯vws(5 Ȟϭ I IUJ{8+æNmԨ!%\D)H^$mUK  oM߭_g];w YgvTiiC$ 9sUzFlBffRI-+}}33]uss6cl2Ubx<\&٬Pj%0ߑ=QK/\ fzWc.]P o@&G*H>FviB%|ꕿ?WM7j!bI1WbVXDgڻw/V===k׮mdj4YYoM܋ER499=Ro͋\J/9q߻?\nbsrҧc -Z u ]AtKLLq<11q~p/^F$M͔O>dՉI8?lu0`iii999ޯ_Z6-MoMmE,'$$ʄlߠVju^z9pUbsl~ksrחaSr0~F 3QC* 3iҤ NرchƍO ~յk׹st9:j3y&uiEݺxn„ uF1h yH -:/ߦͻ΄6矏5c0,,L)4hРAd^ɓ';pUbsl~kszȂ&sϓ6`XvzD*guԫ~EFU<{$>>^zAQ>쿚&"H=% I_ݸz]`#~g0k}L$FvbQ A-D bwUkЧ#Ju~6Ǖ `|2P>CjKcX+9<Y:-еVJRrWReRma~n6ܸT/?kݺVɛ &[˝ZgHTg2 3O8 uuͽuy~B/1j!U gR{lR6Xra7̽LT9gAPofw|T*ΎAo7MH/m~N!1eF*W>Af AqjsƍC 01)VRm+QH+TͼVVs&@T& HUG|V2$mKy7`=c{NM  g5F^Z-h4ZVp8j0,4^q=h+l[G T>z3^hz=5+TTAծ];>>2PUl >9rJbAZW>p8 i4| d2IjZ,xڵkjh}_@KZ[2Aq z3&aa8aA, NWV-= w(TѻmVVJJ fj_=LhZ:#H xn^^``3  A*H,z_ 6X$*o=3ޠt8_>p8m۶m׮]9? {QAjl_-5A, F@&9ݽ}*f4uSzd^^}avQt:˾NDT_Gu…섄  7ok^~- rrr^z[WSc.oٲ->[>~ 6mZw͚5+g=mڶqzy N7 FE!V#p|V"̞c|>If BGl;r ÃH$_߂9Jg 0N:l{V\tV[ٳiJjXj_^j%˓~B M)9J5hrqLF_?88[lpHmXiSNm|},YBן9}BBBfϞp7,@۶mGT*յkJݤm۶@5dm}bb>n@M_nC~Wؾs괩o޵{X$>r5ko?zC"(<<|o[!*2t Ƣ6G33ʸsYxiفJX,T*uvhN+Kן:urCg<"gP`ƌ3=uZ5k&U~֬'O=̝; >={جS1”ϊ;꘼9zKTgQz9Fq\d$߾}j5䗽qFF˭xF,d[wgfJ%뛑iJӚBJeFFP x<^qW҆$IR6K=8s \s+ѳ],͚\ׯz#%%R˄Wjklb*Y?zlڳwLH~pV>s~1cl|5bJj}ϐ "jZްaCH^ZDFFfe{qX,NHH0O֬^g.\Xj m-@ IDATCrNV槂6GRFlN9>A8N@Mc00PrF._ܧO  5[paTraþ[?={N4bR Xs`46lF٣GP|>ѣGk41ࡰ)*/YhZ I 4lû,v O=PQZ[x!*QyNӁC??~>PExq||BzU.*LX]Ɨ/_vhF4>BGl6]o:uvb>++5PP)0<:}dȓtmB$!8̤3z=uQӕٯ_I HSS Vay_@ A`>b:<(jQSq8L>Y\V򋬋?n^oZgAxk X]a&B^6{~ڵ9'5cAR`0 6?*STߍt{xIf*I%baOOP>Cj8&)HD'4nP'!HO>z-H:߈87b]}ؿ0P:D0Y1T |B޸q H"G.嬊g=y֫|:;Yc+"Ba0HRz>D<f}I>3 8zѨ N3h4R#] esL 5a|>.`Vf&E=zEC=CM=Fm4 մZ`7۵kG[H_`@gr7'gmAL 8}F5ЕA 1Rg HuPPkΜA);z2/OPg:T$IRV:)f3LE>r E*wժb؅!!HuB=Pz$ zG4x$6L1h( w6FF괺;v:"poּ9A|W E"IFDjF6=u괍'NmZcE2 //޽,_j F}cǎ@mݛӦMGO"5SNN_Z8kQ2Chh0 B^Gi׿z<{:qE\`oGj}?W-[,Yܾ}/^9r۶mpv9ӧO۷"jF l/OO^go ЋF/N'.yR+ -[w>,i֬6|8:u|y ޽{@BB: SIP˟yN+?߭[w5_]t>ԩg}vezÆ1ګ t:` Ћn/@o4tr3]ozxx|6bĪUW^Yjul<4JP5Mm m۴6K|2D[j%KZjgWr *i`bc׬YbŊ͛ݽ{o%[ߴI2]bŊ+4i\Y"E:9g&>_znݺ8^מ•<|$* Rtk?`ĈTl8رر5],\@ BEOA\Ig&M8D"tk~kVC.\bU0kWرǟW{ -^}v*&Ir;6}b:n9{M]֮];޻`ӏ;u޲cǎ9Y=߷y3gΚ={5 ];7nܸ|rح۷w%>o;=v7Xr8L6M y{iܨ!mۮ)rssbSNn۾j̚5+,,"P`ƌ̞:-cɑH斓moݱ}{q"~Zra>h9s$0{+a]^bV?=f1eWED99'S6 __̢7K. 򲹯R봌M,6[;om޼N:677{lyFnQ x<L܇ZR>l8$I-P,>CGLct7,6rz#%%ZNJJZM=Zj<0w}/_ܬٻn#>4y䰰Ǐ  2ǯ^?ڰzxM1ױcbbb\r5HY9 AS擭;j1cFϟ?SٲeԽ-^zDDD,^6DDeauѣG3o§y۶}ۺu ߟaO6mCxx`f%T8\.III޲u[q㦅 ȍ^ٳg(_ܻU,EʢQ]A ZY3TE?O2MvM`QQ rq_P'O><|УGI걯n8o޼ׯ_תUkyMZl3bϜ5km۴  6lذaz0L ޻) z!Hl7'7'޽Zks|F5|*R0LX,Nw&M:")i\Çe2XgW*Q A9>P(0ׯ_wu8RX,>r9/gUE=6fB+!HTh]DB!0_} a|>.`Vf&4gA8^{1LuDg~q  18RRSSMC:drLmFA c>t=jѢ```*1 k7Yfៜ2L" A7:3$5`0a re>3e5F#h=Aj7a ah j`hqz 1 `0y$A00 tl02?_njJQZjH x|OOOXQ>C!r8ϝ#IR  H6 G$D"j=z4՘C A($I8n0!zaL&)glD$ur9 bu /_&$$ E!H g4 wNwR''%lf1W=c:N` C({t.0q8qqA׮]^=je/^CP( $Q>C7 & Hbac0@ r\.I4 rիWO2埳g6E޾scPTMVQ2Ћ/'W>Dugtۢ.q,,6 d2x<3p8麢:$4!Jv)ڷcپ~-5~ۣg={~Z+>(𣏂:tgAA$Iu>(ȼO?Mx T*UP0O 99iݺwܥ댙_j{o˯|/]4lK/h;=Jr'M`ӆ{3gD#Gػ2W;oK. |_%T]7n)aaeϪ2ڼBA貞i6.hWEl u`捳tE ݳش"rrӏZV*ԲRi///*Ns-[ hbW,_>dV K[<~`1bT"l̔}eBQ\*!2"-M5b I LuiR Hi\s T(jV ֫8bԄ MONh4אyC ]rzGJJ li֪רQcXܰa) e\9{;yxxM1! //~K1/_rJLCGP58rWARIes8Qw ;d'c*P4\0ըM\zE5j-׮_7 IIV QVȈ K-`thtv@vm<ءӄ^p\.'%%۵k|إ ٴ)mV۬٤!kqŋ?j*sѮ^UVӚB 8\nڵqT 47w~ߔћ5o߾t`4i(6 \`~x\>n8jI?2z>)4bR X+&AA""#۶i m۶ݼ9:{|…7mL&9bę3gvإ 8qu$vjRq5j`NR7vhrT x:+nM?ȶsgϞ4l9%//… ݺhǏsipjWg];~8;ETAܼYbΟ?ߥKPXq{ K̙sƗ/uhF3pl6?wNF%%8Ϩ})nh,?^b&YVVT2q\Q)lR6~1n`յk* #D 3B4Fk:?}遈$>%+''Ξ=VZm~~V5 \.奥֮]׀ЖG9tPN׹s&V]xFpl6Lfyo8(߫~^?K1qkד& r9NNND~~~VPC :lhU=a&߻) ֣ k9ܜܜwת]]E_0af4sss ¯^V 'nG |Y7b`HLLLHH?~|^^^RR˗/ݛ6m*\}(2L&S,DiӦu\4.2L,823sRqLBaDb7@]iT* L&QF"ձ#|>ϱ4 h8?uX,Bpwwר]JE8 |LD%-Z:^q=!9T*ho BFM~{CXQ C PC$i4L&MHH0E 5a|>.ݔsD'>߼Y':84?}*嚆'B 7lP"1oŢlq' %h6(7g4>b)X,d ;;ͭI&b%1# LܽwO=7r8u?h4sy0SNRI _oUvmBa~ ø\n9z" UPAc>0fqAQ4  7rtވ QCuͰl&Y.<| 5h4~LfꤤD6UvQ>Cj-Z:)B,7rkr;":(XJ(gmAZqdЎ`J_nnn婊FATc^3_5#DDvvAFA/Kɼ (^ϨZ 7lG##MG+4޲N;\|̚zԯ嘘}]˯O\5zL]|:U~[~JLLq :` $Ћ/`4ju:yQZԦMWA/~ի 92>՞?~<㫯2y;/tě7oع_Ϝk׮J>׬^3uJ3g6mʏAR5mڴЃG/*EYيyZs~¦77oP(ݻ7$$Wsnn.0LRu8NޞСCæm׎f+}-\Dk֮3$۵tzC.@PGub_67 Ё$;u`Qވ۶mۯpn,Ϸ WIIsޣG_ϜV믃ܥ1c<}Bt+Vֽ[9l:G"璫 G/QmZX6{ xyyL& DJk+WHl;9z;ܻwؑJIV\sΩSY [v¶ILLLbl]lzڵ;w_`͚oߤc1bҥ REmVgD(YNNNNOONOOVVCCGK.\⛹s\rssbٜ>}z֭d IDATm3gΜ:uE>+Wӧi?ܸ&O=sS>؅f#GP \.wҤɃ63{65ψ#G>>jƌR={Ά [kb7ob֦m˖Wx^zo>=<aÇuΝ:Oré k6Zbϟ=e25>|T9C:t20 ) z!Hl7'7{jgVO@ A7&)Ho_M:")i\\\\L%H\3 O;쾪I'{:)S( {UW ED"GYlIxP6-`s:urW `0fK8,B<O(xr^lىXuPzIX{LqYXZ{Bg|8"taX3|&Cg6t0ZCTN@r?$CG Bg3UP>W WUD ZjhhE=! 0<) HTPA &yeDp Õ+WzV F^^o^^P(LNNV*=jРAVL=$ec-  3*/틹.8{ݺuAYYYݹs /// o߾Ǐ͛7 B؎GA!qR f^^^ujIIIP(4/㸷Ǐt钜nWR$ f2Ny[$7iJJ]v6I$Wu)әs!Fs`qPj:)5rlsMe7$fgYTlD!^1W0vuR8iѲ%AMA"$[ݹ# ѬR >#q識0 ^ !- LCnrW"X bϥBgNA*77|17k77TU4u_ R:''orskߧӺ~r?Q(7?7ːGL&v'_Ώ?>ٵ˧eK>} X{{pk;u|+3glڸ)Svz-R~Ad͖yyi4/:K 6Nw\e0 gKXAQZUkg@uhGE[mvVڊf`q?b II~ޯs=>GO`Keϟѯ]+{iegM%T4 ERPPT^='$OHJov L\ѯoZUxvfy!Ν=z1eCZ?%''KH kV:B{7"P(ryZ$Ypw|[V))C>,MNw߱Fu’۷o|!:w ++K*T*Df:t711Kk/wv fϮՙ息Κ5빈[*ۜ@̠i.4^dd9*-&' α ;sݧLVĭpqqnJRőGe%;88LbȖY+x?^-9N{xxb`XPUUURRҩS'DHչ{,,,ر#)vy*DMoK,i\{Q$׬ٳgl*P!}κa ZvNjO,۷g{S>|`>755Nj_jէ Խےnٷx[HIYpd[[h+WPWۖ]*7s6?Zt;Y?Dծ3PءC̬ͭ޽RA}_R/ӦO|ASO%oN,7oNlN>3R!vΜ̔6upX,X,{yzj'm!T6njԑG7o5kwiP0xJ gے7wM֑[j5`ͨ * :uԩS'C MF޵DMoUVV4N?RۛH$Wpww;&ԱvmSSSysΉ bGדwdPO:nWoO$Ij;gmjg)jJ۬i⚚DR^^>h ///5KKK>㮮l6REh㍦~W^~YqQ/6Ck$ݺuݰa=IE nn]9~XSSRqws۵kP(l5VhVLo :t@g}||Y@L& JO.m>Mz{bJJ?.)u TyLL-[2,qLdƚ;ʕo&3c,Ok_Q?3Vo!K(ʇ:.ˏ;1{Sdeeee 9?bY[nʫMbkZܿM"dEۛnܸ~Sx<ӓXؔ%jg@O)lcBC6F|&Ҍ p,<xT*M7& \.˗{'AJ|׃2+n8AxÇ߿`0L+W&Nx5  R44JJJKKKGp!d,g-)ӧOYYYfffPPPyyy^tٳBT*}7 5?O$AK37B,qB&C'''8 F34]\\|B^Y<5WTT4Ms\!'5[AA5R!d,7?ʺef5ߟaDgsؕ՛:0v$IJ[8"d2tUA}JRRu0&TZ`0{RvglJzVe2SoPNaW38:8 6l\UU`GJ%3pB뗟dIS4 %/ ױYf[,zϜ1bD NVWTT u*—mrPXQQV-Y-gl4.&S')-jM)i,M{!Ν=z1eC\JNN^fb)GFu5zOVu Z绑R(JVVheYr,vDtt2ie"::q0U+3}7_OHX".W%%%Yi($4rd_0!d5-݅J坄AA?rg< yҺski72⃚=kvQIv*psUfU\FuA'fc3\/18Yf=q˖Quuuw3<= ##c9tPi69 u81rޣ)72Enذ=_j"mI\ضReGtvdЈչܚ:(TXP]|P ^NLͼRթ[c<" CCCN!^Bn|e\gEi|ASO%o ͛όT3q23M#LhB@zk&6lYIڞ]Al[i:r`":g+I<}oà`ޱe J(T$ A>ܩ:9,uϥkwvsFI VP%  V$HSy<^eeE#JaDbzwwwjM#LK%3*ɦp̖X~!͚f\.1B|AK^d'k{+ԇphXw>V֨C'Ip2@TFġ$80tբ뇅_q"j`F-4-Y+kQ>3; iٕ/mɡ^iٕ@tnjz- Zbaj?jj Ycz03z~ԭ x3˜Ĕ.]R( 򘘘[JeRiY-֙ 1y\lI*h[vf2oe*6ԕg+4-ɮ ?XӾ`݉Q@4=UF1]U//$*(rq<iC–,Y#OSP3{oSq@fЙ 1Nִe2]efrJK[/=J;hG ʚ w w?3}>ǁE]j#snÕG_Q?3MOP+R*>4xHLT-b2,6ӁݕZY=u<¾`חDr[Ϲ K}琠9m֚_|Jy_K[x#BmF߻w7?@?C6d޽{fmV~*-Mk1@A8p׮fںG=bWVU]f3PL{M8huJ5AO,:.ˏ;1{Sdeeee A<0w*9,~թȒ ŰpgQ[!87Aݸq==B[wx<'ñ)3٬(/5yi ڰpYQ^71!E|>tuqm p,<f3p-=Br9^l Ag2%#F'Vp d,B!d30!Bg!3Boܵku9OKA.$Rx GdcL&Nʕ6vڃ!R*Jׯ>mTZ`0{R6g’b6ij/T*UL֫wZ-g"#Bîf\qtph7˗oܸ!y|~U<MԉiO~u{~||.BPUUQRa2C6HT:88:99YTgӼJ$ ?ˉJspi3 /uA@VWTT ev'djBfVϧt~zJӢ` @ZԃOEQf}}GFul3G_Zk 5IS smއXCekK P*Zڢo|[Ҋ4L#CwV GF|qFXQMNkbvE(99y]B_[؎"HH2sgUBj͗L5M]ۼB#6X-2\<S7nY?V%IZڹ9sbnL79at 袕Bj>;6#;wןLMirju탡Ŧ3.繺iQ2Yg@ǎۿ*k֬1b|[_S^XXxCDEZhTZfd###$KP(4n /K/aƺjJr[R_yo}KT;w >bPLLʕ55W_H4i1c9rH2cƎ5eTh$IFxC0;s1P H1ÿKPfo }kݺy*W)>yUWU5̙={ >}X,6f =khd?҆ ҽ{tT6q嵵?(<,߳{$Y'/Yj={GZ=wtɒ:6^/ܥKtGrr>}™3gvܳ{ᅿKӱ޽zky\5S#F\u૯|VkJHz}ЉG>.|4 d訨ku8?pkuR{ ?]ƍ;v#oKf|W32|u{Քgݼ/5{D_U IDATÇ:txϞ?oߛSKJ=p@v}Ga;RRUkL>ߒode)Ԗ3%aSbBj2x'PXtBd@{SsB{СK;dȐ˗S;wqO?|!=fgO̜9s)/}Bǎ%$i3;'srsrt`k~xqll알_i2&&&VTVMK;z˗GHlٲE"MK;rtmK?~6-M$mݺ6.zO?|;;q"??E"QڹsOXySOvTlj?,UQYzիWMMڽ;!!aUU}\g*?Jk?/ڌsUeN3cqvvqvv;F<اOo6ޟ?\2^....=u7M95SjSuqqvuqY0oީӧ'N̟?CRG f͚u.-*X"X*-\dBm. g[o1=&PҎN0x:MĚ~wy=2>ÃL>֭[Tb /OOG-:ydǎ{>"by 6[#XfHbok4\o;tRWWKvϬeuS&vmB_dS퐦ܖ#yyq˗EGҙ\oD"5Ӹ{f,H$} :>"BBCtL,i:&H}Cn$"~TZg&-|85u!C⨭}䳊^Z_Qi%.՟MKSR\\ ldy|?ptty嗍\T[߸:...j;$vAۮ]BN#ݺuݰa=IEiIP 3PXt3ih(PxС7ja޼/0`ǫ۷6 Ԏњa));H?-;>ڔ=.,VYFww|(&5SXP&8ԟ 79>Cnnn幺6fV+-9}׮]׬Mɴ'3 >lEnѰ>2EV!55u):c,i[R<^nn\.gl6 769mIeeҲ2鶭^2Do[JeRiY-_}ĒʪOԍ5zÆ*{+WR+W~CRIoJ6ɘssCaF;PXt4+?>Qs Ҽ}7WU(999, 5"Yl/_d˛lɚ ,s.'wJe:lRT*]n}(Æ [nD*K$k&m:$!au ޻wx'+ To :tڵ bD,Yva?C -Ktժ޽O?Lh#=xp_ :vdfg,?22*:zi2nEŒ3nj8퐐70iӧk6sK.ݖ3xȜ9aMv Gۓ&3I3\\ƍ7n8wwfziL~7~sY_|*bebNّɊF dL0b(,: HĄS5n>NһWE 5k֯[׫gӧW&ۜ6u1cuSt;MՌ;gN޽7}7sccQQQÆ ٣ɴ|Ν$GGE>gD$w^Ç =)66Vw1W:}̳}N0# Tj`xynn/ Ґ!5ohu^ōsu;bWt:ͩ5 d9gϜ 4.*jG6%nޔٔZ XdmӦNU(II_0c0&#sQҲ~Y>P(6l08&e]JR;ZntM_Ca|OP'0!%ht{w0O|}}_j\>(zМ9M &yz՞򙯧WAq-ƨ m?+yco{%ZnGج"˽v5͍訹 jlʔ)SLi^0Yʪ뙙~~~>=3 M.dut@P^^~0=CM <B`>C!d0!BكτnBw7 'q}#Zh4СÐ!/Ν F!zg%׮Ϛ޽_4dX,jY#{z魉Wį|uTZ޲eK^=<{%1QVk&믣|}|BJ^={6}QG;͟?O1vyzCw[0~eev} B%#Fɓ'۶n]fȑ<|4֮]m6j{̝s533-͛75<~xQ+W.\Hf}A^~S8iӓWRRryqqjٲSM}z>zt;ֹswYv㍬TW3TST^nn9s\ݚsvGy"е g`L,;HV(ǏQСF B7qq1U~a<^ H2#!jsmώ [DQ>۸}R'QiiMOOO/ڽq^~Bj>oV^ձcǥ gƍ);v0i;ԨYeqR4>~lݖtYԾ~D[rZ7ƍ U*\fZRB!tr~~~ӦM;o>xZKIdҹQޝ1ٳgp77?^q$bWXvmB9ؑcykď>*ܹkK^1wBȞ x=B6!:g!3BB!{ !=|B`>C!d0!Bg!3BB!{ !=|B`>C!d0!Bg!3BB!{ !=|B`>C!d0!Bg!3BB!{ !=|B`>C!d0!Bg!3BB!{ !=|B`>C!d0!Bg!3BB!{ !=|B`>C!d0!Bg!3BB!{ !=|B`>C!d0!g\GRDW5Jaۺ!h2, jLAf3.KѪfOkJj 99fB![ Bg!3BB!{`5$ID0@ $ o$I ҮF5- $AhU$Hj jZT#' HjJRk:NjOF"aԓa I Ѱ|$Y*D}G&AS!  "N64tSZo mIBCg> 4[KD z@IQ? ըP ( EZz @͋@wJQ?X}H :T n ˩jC x-5I- AͿ͆dRKP ~cZhYM; A f acN>o4qo9ߠtfh^@ۛ 7䳪**R&5Yy g+L&ADCVO3:Rr}}riV<;;9A] ͱ=2%ȐuL՚َf|ҙb: 7gjR.՘rbH/qW2f3 ›YY|>Fӽd={IFh4B 4\F]}ӆGb:fS jZ( uboLF&ӱcǮ>eYʒ9L.S(Ԧ Yo V {;x[R)c1huJ5 ҊuPw5{r5BkjޕY$jIֻuرcG׬^-͈f<31# K_9XdDN$>oqcM0?ݭx޽ yzQUZ*Yo83٢L% 61$u&^aab%Ov: ^=幕4 tt  C-ud LM[Lit:ր(#ܹ[׮{fV[nw1k8[+Ȑcz_Eg}aOj<ҽW_M;{+/_7HQáɯT8=*YC clnÇ/[0aW/oۖ{U0î.\Υ1|DH1b~ ?kFς7gjN9;VOG3`-SJM2aƣu+lGMs&h4ڣ[o_:vz7}_u?ь4sZD'O4} 12zj"(,.` {v+U3of5^lYܦ͉}|9c;RRz\|y7mN ʊaH }})~]t_Lß UθrF^?UߢR'__?lhM?χ0hEi革S%=}=^yJJaLW,YtƍED=ޱc1[wYj%LLjNzӁEc3ld|IÍdfdRϟ 7o^uUN.AA{v~!""<,l%ury3~JX#R^mmdߧ#Y?ɮq3qÉ3TS;h#@#pҤcݱ=H$ܥK ɼg٣GhHb&8sy-@ MiiÆ =:*Mkf$!wh?lX416qQ^nE%|]T|Ν .| ߽sp̙?xǎQ= 6NSXREyO@V+3?8zQG@yYYDDK{>"Bj\_ t5lZYh ?bgru rJ]>(22dw_n=Und[7DGEt>nݼY} 7JE7 M{I XFwskl6䊔l&Ng@Ν;oܸ?_HOgٟ}NtϦD[gD@]}^~կ{i|G[U2YGő]_L8RV]n5Q/ #윜`̙LIx :v.!AoN#$G^8֍$2Ĕ ?|#Gz,t~D,}kg}^PR\r=?_5.gdDEGk|6nذo߾AA "8`O,ủ;((kܬCjQZV"]u c7jA^Wo6rȑ#O<)3}0R.pr6tᆪJ/^ wuum̀HnyC{.oN bT։g=W},6•6.7?:t |r|[R;w~34Q"M^:K6?31/NS{R@s'H:Q\\氘t.]_+VttphѢ'Osuqquq;riݶZ*UDtE{ 5:NIٿUJf+P_+Zo]++*LI;v6.Xp.iMo]RR"}׮YcH"CL>OXh@eeUǎ^X{ܬOB:ٌS'8{P*˝['a+V]oA@~5g]qo/zN!Qեbp;gN޽gn~?}Fhˁ$Lr!E]N6VH &]&=:(~By7㕄u <{XBּl+V{zxp9ӧߺu*?>ҥT)h3Aw4%#]Nߨ:{KaAWv;;[m`rqqa$IZ|Q||}ɆHdJM]LVZIjnW_`z2d|鳛Y7[G ےv$ؾ}#/nAM-=3K-{><̕Axn!2] =ðn4%pߙ\ի/75s&vj|o7$X\wywܺ IDATbe5 ?׳ aiQTQGO/ 5P9 !, G~E}ҹn>IgO8ٷoo#0oŋ0UWWۗ`0je2Rii$?cٲM ua}V̟,$)g:2YdP0ʤi[)k 6NΞ}Ξݻf7ƾ3'Ξ={wnJMc}' \tFx˻һoNy"?3vb>ZU`0">n$L:=!aOϞ=, Kàp:vi;oQ-Um~c^SS+ƚOiZTM@Ё+tb4 IF/>(puRZ.bv 1`]tk}%8^fusc ===MԨիWŭHII>ߨZN:m1555nAsu |FkFb `-\޹Wޫ*[jJ ={Uk׬~(7 ժUzY:`n[eؽsNe ؓ-㮏/{l~9nYvQ#_[vɓva`ڴikV~g[y/yꔯk.dTt/ߵTpax \zg7>xpY C =@0>ѣF$jQ27G L@T>|p!2Rs 6~??xXާ )@ HBR|s/s nݺQfa2,6Ӂoܬ$Vti/t} YI4t8.ܮ8D4[AyJUEy,r4Š w~(Sܸ~S룯z?c_ mLn>|8?/ᢅt(^Ic82t5MRSW%14ekh\p>|6˒AL= @gkkk :8a^ !s$P'htn߬N3,6*$5y̓_zPڐ-Q+3[%5qOvlnm~m0.GG,F7^YYgZ; ƼLNJ $PHx ^̖Oy~,9F߻w7_isZV^:@/UTO8g͛7`0wޡ~ZAs#@I$&Z)/zׇkdϬM"`-̦" _:4[ALzfMbuݜmHf7tf}wNі.]tm0= Cnjy&:OW{3&Fs}ݺXj jVu556ms' ˽v5Q3^? ȪŒ{ŒwTPoBnR̘dUUW]FzR;4?> QLuF0JD<91L㟻,Qp53 &mR(|pful{`2o~k3+B;vl,m{n :t~k1%Ȑ7Htfo4g3Z]UUUT\\ZZZUU>4' <=y<wŔH"C: ә0zLKmm-2pwŔH"C: Y0F \]^ylt5bb$!to ,hX'Af}/0 !3BB!{ !=|B`>C!d0!Bg!3BL&0!jd2ٵk@3{B5 уd͍ǠוuBfd\&/w1h? B793`L&SpZΝ;Lq6SB!GZ.K'X[ޖ)qsf9-B!dV |{}Ю@"%;''ЍJE[!j;vB?srIENDB`knc105/doc/en/CMakeLists.txt0000644000175000017500000000015211436653777014075 0ustar dandan KDE4_CREATE_HANDBOOK( index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR knutclient ) knc105/doc/en/mkicker-en.png0000644000175000017500000007203511436653777014101 0ustar dandanPNG  IHDR#&sRGBbKGD pHYs&cutIME 1W IDATxw@IM) (XO=OJQг+gE=b׳wlg>={ٰcEO PCdž%$!qvvvfv2LST$YhU2M.է @0j!Dh'M}ˑ\Fh0\.gvЀ!WP!Rq)T/H*TAcɘ.Jf`hpr9Cb0h4VPPd2e2Y@defࢩLʌ˵+`0466NIMͭej;%004T !H$Hlmm ظa=.hպ/"E". jaXLfll,IƸ8#77`Db0qqǧ/IrCa0+~ Š&cEa0}})UONnnB||PA 7ZḺ_PHU1yN. FGBa|BO c#U$''ׯ_~̙qqq.Wk.. =$b0(,,466NNIquqFza1Seݻ,xy\>.( Fc#cyyWFfXxytgw螵 }͜+'M2ѯaG{(BC-=gU@(?nggg%Z (j%T-J(lA޽:Tʻ3x?yH7WT` U< Sڢ~A1яn NÎGm~17h'}"F_?m] RIR:8{.l}S6*ʱ!{_))ɖB9|l\V~J/-\s{nM> cZjరӧ9:Wν=̞u5ҟ hwuu/^gnAysɁ1 wZjկ={Ν;׬^à3 FRϏD11*U: [ѡe#FT8q"/_Ph4K{s[Xϝ7O! ƌd%?XG!))`(풖T. 6րA>7ܩ))`o!j@N%-dO9XTܒ.bbbjIMsrrƄźdNiiiC/YH2{y }1H}m)d777777EK nr@o/Kxbڴ2W Fk׮sC(nڴIy |:p萡tɲL@b ؔ݃իrrroݺ5|0`*b0T{χTuqԩZRքńϘ1ʕ+Vrٲ 4?͛;vLyرcMMM;uO?>K,III _h}sСCsD1 rHzձcnjRkVTK ?N%N?p(%YYYSV8ϕ7z8Hpa0m&HUBFөA+ n6R_TBHU=r&Gx( b0h4qc#UŘdg mR<4 HOϨ plHfqi`0:" L&6RЁVb2ՄdN S-h[kw!@(gA $/& O QH) P=+^yVU8JAI@@!@ P>9+)EHP1F (-F XGPQK"A(=6R_j) ʫ,֣[9T/L%ou\e1rX=׭a|gϊR\X*+`0p`0_Hž|i`hprƩVF >,̹\\&0R/_q66 LsJj ;kfv#e`hhkcq\B"H"K$}APv>F#4 h4h:Fh h4A@@P>@+ J+d߿/c ;r ?)66dP =1ip|$]]xAO`njܤpڶ}bIC׆jۦ 905Zf>}\x qvv^r|J{;;v8~l /@o?N+W6R3əSEE Cg:֪5h'Nqqq˖.144M6m A*Y\ %ԛ !qz@bܾuFlj„e;*d2ײU+aAAF9'11zL59k];ׯФIҳk-[֭[{]رɩD"Q``7Ș?Q?7nXpkQ~wOM靽o񕼛(^#{͹g:u=RlloܸQyR!XLdc+$'B,ݒ:x@pp0e ==W_ɜr233)ʼx|o߾-,,-Sch׶mΝ%1?+Sy겨=$ irR3B\./Q0{1b!CIKKX[[dҒKRiIM>uT##C)5eu4>`#ݛhI`SSRmRyy=:/9݄ٳgȑ#eRO>-93cb]V\ AAA+WXgmӧMXld2ɼ7}_"D6bUUlb%~hckKc珵jUjJ++ݻw1B&5a}FJOϨ[ȑ#`"5r?֬^3mj`bZH|ߔ1)(eP)HqTf8OKMUIx=u y/ \]jƏmlnܸ&t!oR] HF2{{uTڍs SwVVVv,S$gdԮSޞaٳged`#U4ĄQQffVnnN˗2Πs8K sssOM*!M] S2%$G tu)%TQr(GEP"8R J*>bZgA NA@ (D rҤŸ @U(cQB8Q2Mɗ'cFMPg~ A #* Jچzaddb\nH$e2N7d2,ͮe: Q~%!@,P}R~2C*%|Qä^% `t%h4ҕ|1)m)\W0RJ`0`pw$66VǐVVV07R =|sǀ{]u1A 籑`Hd2r-ss #cc!JH(d2xTjj:ޞvZWwVEO>Wo*o^_NA*km;T*կohh(EBh&$>}b{qOZlIue48Fk5l=F}HT˖-wQ O r4idOO϶m|C[l|Re}D%RlM~ڷo?ŝ!7n>}ڴiӭ[S'Oj,^D`x߯&I׮]Z~k2];wt[ܹu PUPnY.mWa#%HtK7=.HkFߤ{w۷m۶ݻw?}ʁo޼ _QŋW._xt-{?HF6K`cb{歎K,!=7oޜqӧϤlٲ==bFTetxn߾=`۷ڻ+QSNqf)S7\زeA_~drO$$S'IS'CBر[f2ƿT)Sr͸*h O˝6m˗T<}tD 3a\'Y|v'%E{%'6=Bc^pa666&&&SN[5fwֵp䈑cb-R롂333aAAGZ$r f*{emmmϛG{ٰqc&klx:ʊu}Ϛ9c}.jEfE-)]/{{>-[ZjP(|l鲐`HիE $1ά,[[;mgg.GrjމL&S񁆖S# M"{s/^lش1NF ZS,322 jiVٵk׎ۍM{e/b 4 *WNܲ.#\RA=X 絯Zf׮J'p=tpP5B)kξmh]֜4Yf\>>>eKr!077ONNS6y\.1uhƍML5ȑիWЀZU{ %%E KK/_>Szb_|Q=Lө{yz;!mbb f̜1ydwww###P=ZSbnn}ԕӚ4in]$B޽ .rEu9r\FZyNʞkM itk PUPnYUewO')iBL&{Lfƍ##]z-"b%K;vzJK… zIM8'$[gϞ ]_f@ kV ==ۮ};h׮޽{=ze.r] ;[Vc+W|$ʾ|IZje*j!!N<}THH)QFhAKȵl [v.]ثw%K&%}Je͚5=kR)BH&U(ŲW`͚5tzʴ}TQD2{KE!LFڱsӧݫGr*Ynݺ1&էO[z{/[L{qƙ[[ZY;woۖ4Rm=t5Rcƌas8]uݧwӦM5N|3fO?55j{QF6ndtxxOMT"nZ19~HQF5s+7Z»ݧ{fj3FC5w >gl___gڴi7nZxIRرcMMMu֧OVZj 3jԨ ?88Vo]y-uGHZ$(Lݽ\E9{1[j=@VHǕ+Q۷%%9u~8~„sg󵰵gjZ/K{II{;;s>la&i?_ZXX;v UڵkGYTTηC\ Ou͟>yڢ<ݽOq#]8NEq3ןjogמۻCx|`jb0"{}}mK}uZj}Q\͙a?`6 T9p8{{{ qqʺ{it:8~yNFJ}X ccFNfVVvnnJJ)i6XYY[ZXp\RwKK.c0߰%J{fff"H,2dFDYwl4a= Sժ2zʸ 0*G`-). Qaq`pw`G 2{ )Rwf[Y[(tYBtZ{^ ֭d2E¼\bխ[ϩn=HciӦXIƎÇ[ERɤ$dŸ5&hD~~D"drc0 j$dsߣxR˖ΝW1אH0J)7H| IDAT2Y^n^կ_?/7O.UيÇfJcll>>>>>K,4Zj{n__߀[oݻ/ G:PH…d8xʶz)a*֒R1Aba`Cg0~J$ /x!Pe|;vqٲTmڶݳg_N]޺sg;vc*8qdHaq c*"??qݻoܸaixnݚ>Y{#`Qw޹sgXE0'O0pk׮^R)22RK+}?믳gϦ[l8}SRRnJ/^;f9sϏ3vRP`ms9qIK w!$ mlmtݳꥻ۶md>}Ïj䶭222O8qԴ۶Ssχϟ;:s\xx #Ν;]ޡC˖СW,_=3haa,\2ed33w4Fd232l[[yetW֭[Boƍ9W 6&&&SU ELu% ?j(6ݵ[`aa#HDTNOF֥*((03I)ST%Y+WL:U΍1bv)AE+++65(tP)!2bcR?>}RhJek^Z qm|rĈ^^^Z=*dfe)(=8{ʞf:++@Ese_\ԥ~p*$*K$K$ʑkA %beM-|YRu %oAk^dరm2tHb ;;577OMM)Wa4n_h"( k3g͜^_=~rT4k#>_zR(JkJ#N$'먻K^ׯ[- |Ő$BPΝ#F |62g 47ˌ[?#٣ǩS'̝{:1uj1fu޽O߾MZ>>>ӽܸi"{hhhXX7wu"~)_MpeFY^݁Fm1vXs =zJ]eOo*1cMMwׯ_Ke:M)՟ЦסCҗϔL&KMK+({x袻w^%˯_ᄆڴχX,^foiL&ڶkG(˭P PVzP͛ ]]UǏ'M:c:7n,H}Q2RÇ&MK77j'TG-^ةɓ5&Fº{1cZi]w/&i:dݽʠ;Z?lK"xTݳD]]{B_ݽviMoF@|`3#6}omllJtRS3t]m;[[_~c`*mFhablLw0bsY|A6"Itö0'uAjxmN ۵@af\3QH"r:fhdYl /&`"FFF`0HN?At p?Tx=r TGwE|5#`0iPd2P(6v?5nҴOhtPXtb0?e zh?(4P$bg׆7`JtX,V ;"To!peDPX%gd̜5sԨw*tj 7Cb" 0dN:Q~zm0% %ܔV^&?DiOm߶mMww3gN:ǎyǏLl*ɣG=zt…-[Ο7\tm\nn۷/]إK@UHU?gt\\\svv_w/## wPʫ"zի#GhbuMb-^^^s T+lo*7Cڴis䉐wwx_,/oo.]8x@{8,,411;_v!|d>]_b{I_٣组^2oԩ>>>'Nڴi׽{m*BYދ/.*_Ջݻ׿ww3`}$!fpcp@{xPȑ=z$ܶmۺv۱:׷oϟ?@FFgff&|o߾̋שO)S*FF?m޼S߷o۷o:d27mjeM>ys׮СòeHm۶={ȑx^^~~I)@;{{ڵ>|/_ ~TN]KgO9r̙3,m;t):XGuc_cH!B[;;ulB=$ݽK~R7s7:8}{\8iܲe+k鳧p'{w'`zDD~}/^p9GGǍ7fŊUBᨑ#;t0k4ٳӦMp8T4戈k++6J)z]re%W"dcǎ'NXT!{إ H2_/u T:}t:}*88=ڪBnر L4LUCKSp\.;uQU,XLfFf@mkk;w\lj .+,((Ho^23UoO?ϟ[n5;vpXشiS۵t9GH}nHpȳgϻu &e2ګ0VV9gڽOYY7)-B{=B%'/^6>:wy8kkK+GDDޥK-s̞5b_qo E|FVVyʹ}IYErݻwڹx)^^^.|FkeIMR皷hv_Z>};o\ݼuk|\HZk,FձcGvcmeUsSR<= j/ZhȐ!m۴p8̚5ka-Z@-ׯ_߼ysMLL<<<ϝ?yzzY&NԾ}{RW{VOII][h&WV5nxڵ-^z>{* r⫻Uciiqĉ۷o߹sݻɬ]'5jdlbSÆǎ[!;o^_{9s&::ʕ+.$,ɓ<}T"dgݷ^Zt$޿{7g铲9P,֭^n]᭭5T111RSV-cbbtӧO9}&88H1f/2LarJ25F-׭[-DF P@YE7wd)J="ummlrT?Uu@(ʭ#+'Odkk},ZڷmkCB۴ٿ#b! %m1W;ww_m͛7_d1apƎ4HA\XXCMm'|AAg@לRcͿ ||ݚ5z{yiuVE"hղ%`Μ9#LK 4իڳ%|f_XXoQ*Ut>^3"'%񜜜/\_ihSb"#҅^^EG966z,I+=ÇϜ98t???HJJ׿}8;{nСGٴϴT+K[N%f$ñn[n:7NǏ&Mt)|y`-Ԯb '77CMwpЮׯejwj֭_7|𢢢K:99N4 _$`*p͹1Ѵ=~P`gk߫OX>zGiV{Gg9a0U;&DwviPޫl,-,o l߯_~l|U#l6֎ ٓ{))ɩitƖoh41`dYl/Y*1tcaaaanrl6V`0HAdD"D"ht:АbFNqFjUvF Sr99)#! |+@H@"!| 26 =KPƒqr)"U|)9K6HSq*%1UA{BWORGPaJ<4r%+@#Dbϒ? A.2Ê hHJ @$t°.tzZp^4BB)&UozĨ鋌O%FO=𝼪};MFw]*7@ RiF)keJ h+F a0jd2X,126215e0R4/77##CXPdG~ )T*)*r'&)EB%b8; '/a0ofd2H$M*-S%LfMc_yz!Q!4$DcF[rtT):`H7Ś׽L0Ϳ&&&?#[߹Eξvvt=''}lZ鬨Y ;3n㺈hº{L&[IwO&޹sѷer{o.]GG=p``׮AUb%KuTn݃:_ȑ}ڵk Xtk׮mܴs'+<v=F߲֯u봩SIWΖh#!DVV/G Al364qnڤ~S9B4P>ڵ#l6矛L2^z5>kNY-)0111o^qؗO~$^~m 㩣Ν??ydkk+3f̘[7o~=to}džYYYYYW]9r|lG/MLO" _@#4 9Gǟ6|xi4gnng'A ߾}sK.1 Lٹkg8ydzbk۶mǏ?vXjZ۩8>}cǎk׮u|r'J&/-70RAdF7U6FFuv7%w)tjjtiӦ?I1M7Q=z\rǓd޿D4ԚpS#3)2Kğoi_Nv:utĉ%KsLfmmpƍw 2䥋Nfmmmbb2Xʕ+'OrSLr VVV,kРAqq+(-{d2߿{oggOL0 ľ +kήsե3rUVՋaCŭ;4tС0aDJ[ϟE"HD>jhߠݝDyF4H~G%',]ggk>pRY ++N%@`otTZ&&dd2J@3Rt:(===geݽ. 4,}:{eH  W(YHFl@zn gYˠɤ3^j/co~kӺ宝;TYXXQԮ]x\.WP7tRRRtٳS =ymظ1//oWM+Y&,An#7j,C&sCOck7? ? rY+Q| /I&~yd]]6===//oqN֭ r]dΝ; %jbbg|]aYwQ33m  ##񷡿{G MaaaаH1׬]ӫwo먻ާ aaa':hC>_]*b2x3 5-55%E.iݳ5661߉!eo~gmMDFLӘiHcӊX2@2,?ֹ :o޼u>&O``@'\KXJ N;5Tkq]`h}a=Jiψ]zo3Qbؐ(%'RcI>ʛv5`-HAɘ +XL O=t5bܥn3jF%Y"_ӥM!я2$\@zKJbX05R݃pьoSF cJMK704E| #ХP>11'7%Frs'&J$TLA#_fV.,혛iRѠB4$ )Tu)kM"Jה6"#/9!BIlt6jgpJ7B@\VTBYÞ @( ޗ"D"J(@@$1*rP0қ &T_9"Aȣ3qbH0Wu:tGEr*V|d+(I=rx;U1kTЁ *.%{4*Kn p(䋨{-ҧ%ѻzScR `#``0mrr YlLZPPd2K K<FڨGGG'zl}]~ 4ň^ !>cd$޾AP IDAT _~u$tݻ2FWd2YjZZRRsg33 lvY)f)Sԩ.˟n^|EӦMqcpK +uk TD"߼}1{ݻwĉ?5\0~qchqvv_rD"s\d>}!|q̵j6wߓGwGL*ݶuk׮|}}͟',( <<< cTdSNWoo!C$ǓҢ7vEzɃ{B Μս`#zL&hC{ϞPa'ijAs4}{^|{.?4dnٲݽK~atg۶mbJs݉{؉%}ʊd%#F~-[^  nI,ryn~^-}[&"Π'%._ܭkWR={z ,'`fP;ܔ)S9رco޼0:F5}4+++5pxdx&j4mmlf͜FwySTT_P n߉?g汿ݼ~ޝ&MlѢyRd;HKKKʝ1(4B"zx-atԴ0e2ʲ1eKݻoFFƓ&MT 7?͛7ZbŅ #GqDbVVV {0 dgeEҨQUV"?ː ܹa0HU8F=`0\\x -ǏG10 6R {5HIFtiYiD "O(T ?Pեթ)PikAP܄"92)Pw)*K%V:ϊ+N RsAi#j%b@Hc&Ҥ2@m*("SA h@!@#P:\q42jZA@߼ԏR\er.zY_Vհԫeqfϕh._ڣSާ]WßRvj}Fn``0xL `#`0Ha0 6R ) jӽ"ݻ˗޽ H/ׯ'ϳ-`#^79zxz2y{gݽg= 6R2ݫ𬹎1t:=շ}rsfmղ%^~]^.[|ܘ1W\Ys=FԽWg ?1.vҥKu{Pw??e˗IHODbJ+WI$ rx+V4n܈?n܎;7dJCcƌiӶÜٳˊG&m۶[~~, TSOۧCCKx`hZogË$7o %ˍ7)cϟ8x'Y;w;v>+W\0Ha4SOVp(.;Z[[Y[[D)Y|⤉\k6iī׮W]4i"kfN4kUf͘i>b䈿#|S]B;~Vg̘1nޤvM:ʊb 80>>W3l0UJT]~_R``  㳳U8첲[ ّn{{{>_FDLǂďU͹ܐq^^.!322B¼}|.SSc12 ש<+rn2E{@@/\|ܜ r)d.K(YL&``k֮mꪼ_ X@$G]MbVVV`pKy-+QQ8 EnMقl ;w&=6 d 6ԩ֬016 Qq37wU73gk=-A\k'Zjyu+jڪhkb VRKmRH+KE @ ͽYgq%|s?7̙3ۙ'˒EM37k`k7iS$9Cd4TE>b1W9"~(<{/tEZ[{W6h':39ܷ~gYgsY0N̓g9v?LSIaL ^wNc !@0R O<mK]{;?˖-[lַy'+mRa49 n۶mҥ@Ce4TEX\ nΝZdO~_dS]]=-[_!~饗V\yn?s^|ᅕ+Ww8"SMgh%>w>C߻qi!PPP{ CAd-B= ߶o}[ӳ>{Ŋmoܸ߽9Iw,sv-^lKގ<'\3c ǣiW3"G,JJ|MA`U$r|K.Y#|o(/ν뗿+_}lYv1꫋-** _KR.>"9_};߹xXGp"d|ʊ '0\Θ;9ᇕ^w]ziYYB2/G#vνi**r$ҹdlنhЊ袯>ks~a(Pd9W/(Jcvuu-gѯ+'f$sӒ0\|s߿heee^@ t޼y_ior0 לxg> *++Kvм2u߼FӴSO+h|{? ;…[z>TFV3LX3,?7a'0zG.\|Z@[6m!kr}'#BYڨ7;'+xIJ6l2!zÇ{a<׫=G9>~%ܛ43[iIJ !l8Frn9fKRk!`g{ү7GZn}Grj@o`"!jggFw^wί 9~?C ᄋa+`p 8w^DQEI:B 3tM7ȅNR֑_#0imoa'b QKJ:u{ .IC<<>/u#B M@.\vr^ԑ;S96a !{O^f9zG!$4j6 2)N-`ZܢG)h bJ4jڦlƽ^em|q>E UW7ؗIن!B7-ٓf[:e~"Bʹz #l0emF3\\:6!Whzu//߶Xw/ tL AREsj$5< 43:-k0)2-1p̉sˆx +"d7F4et0PeRTG!cM ylnD|#xLLPKDDkpgqk,czzٙTJ"1MN٩eSRzDCK>lZaa6V?7Zu0d$2ej.0x.F_=)=]h:hwW.ؘ{޽.>/= ߘkې,A`i P%@I" c3tۍ13i1Y*CU+ 5}`-oFg,9oƔ$a6nLE6w1nm4=oӗg3F)e-9sZj~o9s]7n RS o?.Byye_6! I=Ēo}gM7x.l/o|C4W}ERJKK*G5Uo5슴q = !撄# P*xH&eh~AA=i1^P_;S=}D$a`#41=CUϧ$΂;myaHQ d^VV0pDxq_GˊF\w6(<ӧO>=7_?nvI;0 hh СTRpƘyIDATY@,@`c,D&t lPJU3-H 43$Ł,=iZ{7$uSI386 7'~5$fʳ}1LcTmm-] n aP XmSK'G=R`Z t~di,pbýɓ1C OźAA`R0$d(Pq'-0))2ĆE}Rャ6=pДhh%Ӻ2S J*FZ5Mr@j;{?T8< p۶g̜YWW{UKR.IhvW (PS]>@oxʅIuwPfW) `ufK u1Pd, q1!Βl ` qu#J M(5=mc6b?Cj"E ט0Ƹ A(N3/OCfj]g2ƘORQꤲ}@n">x`e%_{m/٫ZZ7oSw`U٬ #I|ce3z+Ƃ_@ʂ E"a"!0AvP@ l ݺ5C( ~h*(fDAE%X!鸓 zbV[}[rݚH L(i1w? SB*k w"/G"TWś*+oRIz)iڴ_F\r𒔷'w $ 'Oijڙv2mҺwvO2 ^aʙESiЌAe0 CU>֒|ݶ Uy9 RDDȲ ˅a9/_ۮ7'u#L0Ƙ;>⨒i13p׻a)k-Xpnms]cKR.\8\$%򔚚SzTL'[lwsH^ym D"1G\ @e gLPx&?^sȾƄ LƘӨHѵcT!5fUL(B`A @¢[)M(jOٔZMkx.]dzW3g JJJہ\80 ^(:aISNK&i1uLkE{O,-'Y[n1l6ٜDtj{ƚcWЃ0+6€RQ?6;fdT*Meni%ƅ2yU2E{:CBYuRx޹Vi:ajW˼1FOQh'#9TUζ?rGݿm۶mx,J&Sd:ɤӃA!&ArE?XNgZZ`S<0^2L$~O.lv}s'[لH10b1m]tbBcl$A%QU,blXyeY T~m}j1Moi}xUT^1b5_9IQ%qf&erqZI6gC D)5My+T2¬0V `0 Мؔf Z}a+"7߼9ݿ=^qUO.YB,S:A?(rv\(AaOOMi(BGF%uttCIXIs3\jHE1VM룶}`co8}ݜ@Y"xxXTT&`"ۼ$9ԯ(DIz"4L"c(ӂim3)FArK)l`=0Ƣ(蓩[.J{},+eeSL!1֞t,|yyyDbWBKR<H$eYNR(?O>8?LZ~k BwܙBT*1DQz|x4` d0<<0 3 %ԔL/{IJx[ycz<+* *ꈄOeL>4M1g 6; :,z1VlJ1·% I(•$"ɎsjiYCCGGGH'UOD*uקRDGEQYtg1W0~Bּ ʒA) gΘ3@j'ѣGˊI@$+<{^/y~"WWW .*ra44q-bgń_0ƄDɷz^yy]t&R^^N9(UԠd]RZ1bG Iqlvޅ3[Z[ C>'$Fha@(T۱w %QۖѴڤI++*TգUdyΝp8ae2$ r- zmg2UUc,L=fJ4%޵㷦#S83q4yW"{5t;t۲E cOCce>Dgl# BpWa0H4jԨPeƮH$!gr\bEFdIg!H&`O%T2L&5-SUU%ˊ3|W dIrޚ\bX[4 KE^4Ta HӄP(Г$I-Ə_s۶#]]1$a+Xؑ#1І6٤E3Ƈ02=\<5ĸ3R1X  PzQ=z,ˇL*Xww{{޼N>|x7UPPJ;#EEEii,tCA 2X3}$ιesjkM29=/tw? ;w) ‘C gRBp !cƌQs |5\<߳{7w7!(IUxY1H$L΋Zm02kqEUU^o~q̈&"rIENDB`knc105/doc/en/variables-en.png0000644000175000017500000012323711436653777014425 0ustar dandanPNG  IHDRvZS pHYs&cu$tEXtDescriptionWindow Class: knutclientV tEXtTitleUPS variables ? KNutClient6+ċ IDATx]w?vatEY4O `APz{(( <T@P' *R6I&) ~swn$9$AǏk8 0 Ⱦcǎ }ufU?x<.u]>x L?K1cZR!/%2dF1T}i<c1T)(` 7)HSa4:fm*W(/)@Q`0pȑgTP!)RFjbcUUq.OshbIhfc i d|.Ub\0F?OcAFGkLyyk)cLƛ>Di_<3s:._RV3i>;ߋx14( SF%osJ;a.L*w5T%M'DwW,>U}CUy-̅%B/*`~XO|KJ4ت:dJ)9r Tj+V |$*(J 8zsgy&IIVVbp8l*80)˻h\=Y檛w>y`9Ir\gNϿ"*'$ԭ[F2dBh8ӐN81 ,=)b9dLĖؔHnlz/֝8~c|(`5C#Eћ/cr8)n7|0dQD$Sc. AdSꢺ$d0Wiۇu02_eEaQ^lTVTRZJ ZaO+R ֡i5.aˮzЛ>^-Bwb&cPL7p0M\nw^nO?dh]}uՌP9)v:0QUCQr>$zw1@+@yG{裏ݛGR[W^[32v>}ݻTN|fTMNI9w~o3y^ӴnzΓ7sSM7rxdKdl3QW1݂pcX1bbnU0XLPP\Vwym4F]Cp`isl, Ygk0fYaPwc JS vl :-QFaҜQe7w}`Bo?fܹyC4fӛjq Aً?h3n~]=€#-YTOr#(AE!`L^z|Ga77+8/cv< 8Ν8q]tGS>VUnksԭ0q{4f͚hao׵k͛[))))))YYM>ĤJ))L\9l>gt9}}﬌8+1 {j|5!68h9KM*wPf7?yi  V/qhp*}Q~=}Az}lüyO:Y-A<9V1}`AY}@~#MHA ɥ] w`.l%SW< f͊zV_J7fv!j9Ś۶yDiYw#.Š6ABtn-"G t%a!g,h]h)i 뎦E ~ĉ*U6j>h* 筘@Jjx+ƄIx,%јo߇%LRJyEj+?}T{޽{OϞ=6Ua_{5rzr5M pK Mdi)5i:th3.\㜜ѣGiki׮wa)j4+%p3ճQ3g)ts#Ӓ^uUC}ﯿ^}ǫnjJr;nt {UW5l476ߠA}ĉO=D5aV- O WA A1H+n@ݶ[y jɖ^Qλ(?%4DLL0g5a.Wi7cM{ɹ0 g#2 YD/ 8/W 3=QR'-3f1(]R9gfGHEN}XS,P:(ls@PcoX 4%=(gHygݻ+;;[ ޽zuS{pvk04w㽄IϞL~k2a) LB!5&a)0 UBu<u;ׯ_իWφ?^r;~_~ݺ'[n׮k֬UJyYFTΝE,]4̚=!4IlK ڷowKj ѻvɮmbw!uQIbG#x>Rwۿ{dذp8h믿~ik׮M6paaI65͉'nO(~-7?xТW^A _J0J:_W C0jQ j?\Å\T jA@- $ aU%S4%]>rbX&z$(40B[Q!" -cI42 zR4H_42+%γHzPNuܯA Ec\a B\A$µ\3 +ƬC[jV:WFC R1: sj.HPn@IKG^G0nͅB!ZôLfJ9EAHsH B"UzsY!ke|F u4.Ou~u9uTVVѣWZ9gΜ))I0&n3zm< ꭈ.^:}ж߶hޒqpye:t-=F=!`E,^n}ZZZ4Dz- ِ=l r]8ĉݺݨFE-w… ժUee.O3xҥ7m$|geݞƍ|y]tS?{c|!?`Æ *%\rΜي$''wccd5櫰kO z->ckj['Mx`U]曫W>qxjJJ{2F[0oޞ={0-Z8pPS+?7~\jjK4lndee-X: ={IJÆ Wr_/3{]՛ B|ٲUV?~,55=0'+ԭ[w)mڴK֩ M@+ i:#-Sb4CrSˁhe0t`zYYL/Q9(lO4~X]Yl^cmbXdfR(`Fz5~ Šk!nbGVAŢL :hn[o Ǎ{,/7RdhEJ+Q[=zZ|AGV0ou|u4c3 XnU߾Gɸٹ322Fҋ/bUK,Ydƥ$'p4D2THnw@hpKLL *Ch~Ie(2+8JLLͽO믿iӦw䔎;nذa_Ѧ`׮]S0ƹ99nݺu?IL CӧMg}?xllu~G$3݁=xQ#G ٗիפI,[y\nAO:pڵ۱sDzחn1`VZ5s_~%-- >faÆt }8.ٳW5_}%\ߩ/`"Y9t9}2W_]v?0;̳7oȰzꋍ_^]ؿ7`@($n`tNM0aj qD/YD-l\J1b7f)VaZO'ĎDi) Po!`F΂dIyGĭZs0aT86E{&Xe-Be:4*dl4Bԧ+PL!ͯN̥ ۞pVB.E!&hXkIHL$Kao82!ѣvۈ# LXdҥK?䓴ʕDX~p.b@%Zv-[VBAR1^`~e˖}~w[aBݺuŤMHtƁ`0..^QAF$%&j8.H`7@;grٵkN2zCcܧO`Zu@>}H73vlF|>n K= .>vFyz$ z|`Yy衇}11o6UPPv[hrNZ +/iSUU}Zu:4ob,e%xGJsHLL 0J.VZ<2󑁺rJ̕5v+TS'8| kj} rq3Ĝc,>Ww))>GQ& fiµ\=D'OilC, ÈجPV5=22I.2Eh 1v^6M*V)t.kkn[hQ ;]A2 4!VIJ7R2^`MS9z`Q}T5G$gieFIG\.KnᏘM(\.UUdd 1|ႅ˗/SUuů1cRRSp[aI8bdW_]2vy …Ëuyw}ZܲeK_u[ kD)(!>> [lQÆ. +Tx?e-Md@bbb^ xCNoرm[}vÇw]iiiþ更m߽K{.,,$ٳ|MLJbP^ۿ?E!#p%990NII\sN< =zR;FX5z޼G jԨ9~] FnT'N9ccUůzŹHږ[۵ky˗oa"<&0lBLaURr2B ߕ`(Kq;xgϞ?>!!Ν;I*f]f nY͚5٫W׮]>rvߖ-_6m@ pns0nܸ k>hܰ I/!|{,''_&7o1x^^^ZZ<HMMn JG|$:mB ۷={ M6k׮V1_(97I#|hAOJLxꩧƎ=c^={jѢe_z%Ap'NYCǎ_nԻOF&  dd9|65%%WCl4(Tƹ"Z'b >9EvK #2eb]|,XR  sF=t(wcdLƱfPkl*Ѣb1=s #K_=38._J5qXN%6[oP )BHU1q4񜣉OHxkʤ]h6R"$(ϝ[!CyםR!Hb ]*]RätM+p4.b`^_Go֢E0 /= `b䬝I , %&$֨Qe5n\ǏUHOC_oqW/^h#`Ep뭷`2"$ZA}]-ZHLLpum҈'}{e˗}лOoaFx_fp쵙 + @1>>/^pNLƊFZ m <1?{y?ēO\ﶿW_]5Q#RoM+NfTNTE\1-?z觞|01cbP59_mv [.\8|P5Hꨑܴi9͛7?tТW^y cz7pƌ;{Ew+xc7ЬL}k m'! c_7ճٝi ums[D&< ֐M~)DHQ]SbatgűNf$6-湸FV蹴 CkeXiGJ&3k[?Pa\`ci&.z6}֤1J4Iҵ ԃwꬪ QG&Yװ[EEE#_R_h_>6 8Ƽzuǎ|>_vv6܀U|w.F oطoFCck15j$*8=K, QY4H3(4e̷&ߍD0Q!lD .ӃȹDՃ SX7jVY{!D0h*֎!mO3i}<u%]@۷31PCu׽bCu QG \X*!.`"9º1kt42 C@ 4GSz}-hbB`BB$!S.M/..GS(gL] [JkcwOn7VJN.,*Ftu\&{ Cٚ{] lۺu֭m۵3mk5jtU#bWdM|2sL:lނ@`6,w*BG t<3l lM6YZ9]>l2*iOB7Iq .A\PT . zՐʗo,nR`ιn1'zrJRWة 2" 4#02A۲:W:ddz^+ yN]/w;+oȞ ȩNx._!0֎ <S#Z30F niM76OPȬcAaB@ Z1 =A$\bZ-V8#)PyB[-*kHly<֭[mڮ}⑾>W/6hp"[ű L[!1/?W 0ߞ~Gu(@\4[q)6o5jx^߀8''?wة^zCZs<rd^_`bIl'6y1G 0g]5_t^B% M|k}fgE\tvNgzgaZ=5 ֍*x܈{+BHA)7>EY:uqvVː9mKVE`c.۠QhXss뛪X2 V\0+Ú2 / hB/޴$_,l.ך +cl\-xY--P4nG#!?q4D d~+x+S9[p8 ,?W 0UnJpUb\M ⊊o:[nSR%?PTX%C4+y=C`[46MA~H#VXcB6]S 3dySh vOLHl 4zZ֬:ԻnYQ>I˔c7>5%Xѭ9Q <#ʃQsV Ծ5!0/:WqCfN7G"ai{&}@Y9kc%OjFB!xΎ& ]E^@QQ6\]^IquBYUX EEEE*|1. 2ߛ "Fl: K,#3CtU8@r:P u1z\vZ62Ek@0q7ovHZ]RV07C-i--^Gc ]>, ,M 6>K"Q]DvՕ7ARF B#^oŊUGSXP x&cz$..΁I eOLL%vyH3>'' `(TXXG%h&+̾L6Ȯ ۮϲ# ZJ́"s`*9H˜1Θ ifdc[斉H39ubdӣ(~XAzi=& 6^9M{*k3ؚ=>=_Eq3քYأx:[ c^ Fi(_]` >0L(Is CvsSIT|:y 2o9˜'-D|{Yhrtc;]?T.^"-%D `@A( ,͗oP0,*,$)x\%pyѣLD`ˉKw 0\Bq#,-l~` YvCCr0Q$C<&7˝|v$fTt `lB0F1svƜ`# ~! nXhތoA bЌ!!qc[cuTc`aXEF,.8'4&D0nhHlȭ?Az!BYӘhz@]`i$1I~?`%8fQ#wy% f(@#4h,| M!;f`ħ`x [& --űJ*"h>rީc*pR0ƀlDƏu&]8ЅڎsZW`Sa ZSytcZ¬yf1!rH$!!QB K_!b< E&"zX,r' ?`GC 46D~­phQBV詞bI)nJS*0X]X09=7 aUe|+lK Ib`w5%21Q4}FsI&bb^gM44PhHci #I mY:gj|2*-\ e] b5!t,G%f@gg1BH]]q-7Yט;cZ|њ@7X4 K@x8y /{6Z71i6Άۚ|Mn#ia:3Π%!?Z<CwE``\jz4{=U5df ;6)˒8J k1Sh}U:dgtbh1._&"f3k"ZAFs僡5EuJCw2cP=Z0דht0Mt[s?cfG1aDkRl .[ %&B8 ͷ@gx\L` ygZR`!W:y9-y#@\@ AuZj #\^^cf, q S``gt|`Ā)134 F[s* }PQ&]B':*A-s$P x!~ lіb"q1[-B !"cwm- cMn60Hȕ[@HZK<su|0AFuwQ,i^5A֘~:J" h-U rq NS \z^a3= DyG-֭mq2ǖ;fFk#yB +R|E_)xª,Db} m!5MLЉ \ Ҁ@^Vrhz"Y/yt`Fw&]a.aٲ.D] Q{<6Eڈ0(|T:E6m2hq&͵0U"@-pKTC_愄 퍎:02ʓSص+'B tmrmG S)341e7_W᯲(ہAbzc`m)'p0wX΋ddgxX ΐ1$aƜx܏[(*z4fKx04=e9\^3BB/N@!RDo]a9R L,K|?_Scp]#!dɴkϐ_ 2Pa%bt +2YȮsBci/237 $gU[e1|W{ }$vǖk7u=;Pjع.VQh"k  )lLoMM iK4 Ёɧ`JLYf,7` Kt>F h13ה!ŋ'|3E!FrHBE&2B]0qe kle-`48;ZסeHA?My1XjpaSG@%HC`2XOX+!RwM@V:1`5ZH=5CIF[Xٲ\`DZ `U#Zp*bH u’g' Sj=jaۦ8,d419>8яA96!,υzh Xfu6s_02󯵮=&D 80 gz:W臏,FO-pK uTFqyŸa?~4L'!Cs.jG̛d8حWæfa ܲ`,EevBAf9͇dy N}5`#Oj0{M7Z;E! ܀6m-D|.CKdaksne@ ^,!XF|u^+A !MXWR=0  w_١~$5~P9s_Aj3u?[TG`*3L_"C2|=5AԂc37ꢫ[iOlɊ"0&"N!*"X4Ś/s~ev閷D.( ch 'Hkw#XZSeB!rb HN+B(N׬Ee.Ǭػk޽BID6mڹ ,D!U 0\EEEmw7V խ{w֭[: 8劣KHA߷WAZ/y[}wQѣo󶞗C@ [mǰk׮۷( oղիG 0믿/3kgΝ3;/FN_~Qs,]Zݯya e"D}wݟ|Ʌ .|'ۡ'8Cvftu?kxr„Ço+~#I|e+5~';wYΝ;m>rO/X*®] /ҩ9||/-`nʕt2%WGnaaAiZUP_Teq+WdrrrrrO>;Kɿ?&)))OM':+Wի_}8gȞPNl;gΜO v 1ŋqqO>DN 77zjf+YTZUv,y^5իUgKZZ IDAT111̘HHF%.,O`o}}w{t۵oWPPЦM(YzʕP<@qQ6ffW7jgb_}u͚5 vɾgϲtnͲɵ]Cdee-\cyד&=i&B|Zc;v<%r))Ɍѣɗ<| +Gny@[8=ȋ/R~;z)guW߻&?;CP׽{Ǎ%ejؠAW,_bA=A˗//..>yԔSY LUUsrr~{+$Ѯ!ƏP(1$gϞf8y ̙Qs9s̙sq˭$1!>fny٧O>}YnGk/!G G֮];?wA}ο>?/...,РpK[V\žN6mܹc\A]ˆ y '''33.[9%vMb䂤D SNyf3K,\C_$]r]eee\f͛/{}Y H]CtyG̜3{6I6lӧxСi֬YϞ oƑ#GA۷P8z3|F8MHH ȑ{rܹ@/.< ~qqaշM7srD2W8_!-5e*UEEEujg?q^{͈zQjUs.36ݽgOU+=vr M_us]|ZժV͚,g MvD6[X*JBBBB Ĭwvڹ|'n ( #dpPB/ƈTI ;x[Q  '9xؓo+ {X~7?ΉO1sƍ7dθu˖)Sܱ_Zt@bbٳgRRwvԪU\תU+''G(Ů J*Sj֬$a(JBBBBELLLؤP(@>9@a 11`/7LdlOIpx=^3oDI) ;;{U ֏5꧟-\!O:s.ujG+-[ڰዾ} iii"DQR+W$9tKFQW0] ^oLL hCvB31gsocï'azKWC>gϞ`01 c4žߡC}tlDBvG6uʦM5 rsssss'Lxw>%O'M ,RQ+DytAu).%W3nqժYc)-&Çڥ3{b2ŗ&MXF^={n:"O!;Z0gYwmێ?Ĵi-[4o٢y*U&Lxt1?5aBRRbkо]X$$$$$$ܤeU9עw6Tk.3);8bOp*!!!!!GǬwvUWEQ>>WQ\ /nݺGH;l=U{ <1IK%F3 yncQrŀ %{'3\Wxopa d!Fe(#t|yB`8^JzϢvݗeد 1?5HBBBBBBp8 /qa]!{<^߂a}I{e$]=NʉL]U3r|]da ,~Bcܻ3 "Eoڝ?d@WcNLF.*VجY3g5l0:D;v<Ѓ>o 5k@IV]?x`>:vӦ/-~7ꫥK_x`_?`}9H/!!!B0&yh7PVºBpc1X m_Br< ~' C;ߠAsΓgϞ{ d'e57}e붜Ssfh'ሑ#Ǐ|]"տKrՏ@S,Q%\GxUUfĉt<{leLo„ -[$<Ajj L>]۶$ ;tY]tپ>n׬y;ɓXb Ɛܣ-+W#`7od;u6}IvN:WzyW28V^D^"E:;v Ǟ|X 㚖Ǐ:tpvYzO\߱#`UUvlۺuڌv,,,Cԩի'?ޭֿ͜1sUUHOӮ8k,BP%!c\`<}w>C7-wNrrYMkT~T ^xMڽ[(MBBBBLq(X d#aqj%=`153.\xM7vhߡr}q*U4CM~vrnoذIOKK;tpff&:t͛7Ϛ=TJNiٲS^ch{]NnݺMRR%l܏ʗ( ƣV̬&M֮]1nr5jebl+]IMMIxMXc/;ۏ;CBBBB\q9N&R<ԏ@0 ?b^7CQe}7nܸaC |1C|<۫Wg}67/77/wҤI$n:))Ɍ޽7Mvm1n>}z&&&ۿ & :l%/:tv:г>3{2I8lذ={ՐO/w.~XR+DRb}]j37{g֬|oWɓu=j4y'?;TReС]K|?ުeˊ+6/6}ޥsWM7ޘвeKUVIIݻw Co馂G-ТE\8KnW}V-oԩo:~87!C4>>*KQy"ި/]7:!Ĭް2衍1>OZ7-1*1>û(_58SBBBBBc mJNjsEQհ(>GOG3e!_*VuI*wR;+x<`0gv/>rYqիG\03!Eq/^JjuGZ>@ 7(j@O<{3kլV]wZvp8<}ڴ6Qڃ>ORS/Zt5MRS6lp:O[W5lHKHHHHH\(XbPW slS9gi{:t]^I'}-VNn^ظ{bbbNJnw_lܘקw7|$n޼Yfe u]j??&3fLMMMMM1s?$n?:tIHH8qƍgժfϩZj\\3|8--$rԩ:w_vT222ɆjTѢe˘j !!!!!qGݯ ?baN81//7//wO~$;t࣏eĉ:hGǎ=pP(??%6oL>o߻.V -V0 {.~XR+#y]JmZo.iJO>IK&NYF=[j͈ѵKgD:jmݻf?-=n+tޮ]2P_뮹/}e >%YWyS1ڪY+#G{ѣG$c}t죏t᫢(cƌ3fe)M=%UXA%gZ52u+ R+k׮yO>%ҥKyA#F,\pDZ3gݻꚒBϾ}23)c&cMMM7Ξ;w5R srrNffc2i+_U @Cr' Zz_z *Bsa[ۮ+W~222:wϾv=]LOM]aaaA\ǑaaaZrɓ !+11q`TԚzhvI v`$+ۑd1XY??>!!MLL֯_bŊL\ d1JJ22z?jԵk!RRRȻSN]hѪivvm-[|mCAՠ+ n}A0f4FàQt>̟>xо}XJ}=.:$(?oo_xqAעBBB85..na_Z 0`eZJ̉Q>A:D" zo+a_i4T*M0W ہE;qz؋)S\JJ$uGi K‘Fef455e2T*JG'wɓ BQmKP5PF!n}BQ:`6ٴŤlsd1͛9IMMr|PbŊaChV9#n&,JJ%T*՘8]eL94k C ]dIk )RVN&,$}HCyyTJ쳤;1cooOlbbbbbb : J#AlMޡyΠӑR]}a_@E 43yf +G$fTQ`nv7XCF~ ԩ-6v!1+Wps*- >0@ؖqvr7vL~~~ Ii@Nhz v IDATYDV?,,,$9NL47nv^B[4!"cßhް,oDEξ;kf,;򕫏/_"y y!TPPp8Vlˊ УGBt֭mq#G477رg~ 666666 ׯ̝a>BH"JK`o;öX7nzx{8qbÆ n=_CII}hgk;axG$-v j{WK s>wtiw~mWwOGy 5Z1?/g-[|{--<==["'d9c $'0ATUDcϣ4'դKbѢ#.o\d f0aP rԩlݳGcTH$JJJpsߓ7*EQ҇BୱhC[!lko\vIyFz:BhA/f!N?A A. zMk 936ciJӳ@QF僢23ACA}Y뭀eGm?m=ߑ8rϣ01q}{vc6O|b`p'zM&W/,1\UW.D؝\.B(_W^ݼq/~Z}}}vvvX~:Eg̈7w.ҡCW^ڎ;O;@%\˻~ㆫ۝wB_X۫zΝB S.ׯ]{qNlK Gj%P!ccc2FUUUAUZIKUUZ)&❜cua-::|>;{̸qʡQ .**YD"g]RZCɼڰaܼ7bgLWvΞ?'IR*++YF僢2QPhX_Xb"l6,k;nY6iܜ9eo߾Msrri /.~,߻;C,,--Y@J3vlrRR5_+]A|^bB3]V:ZfB``jժ'_Ul?h/ݳgG5J.=΅p%?ŏ?^l}EbbzTReUPP\Uv`bb`+4%lBB"ۊhcc:4&b@B(""fwh0tv?޾gO>ݻO~a}~Ȕ)Sٽ{_g1f9b7l.)1aQCz7b˗w׷WXXhPPNWwtlrZ40.τ9ŏ*pH$XHGE-[W/Qoog;,]>ȴi\\r~ڶM?d+n٪}l%ƒ+**Fz hxDɜhQhqRч|Y ZVA-xĉnַ"ٽ{WIqIrJ9No_6h4کSLJQC.B@(()E ȹCq ;|@=5}ц%,LbbϫFPٺeˌX}+ G.&&~Al6Кf @+ػwaذ˖-׷:!ĶR3lmm 4!)~=< VfYKJcBqy*XL]]}Ν;4E<|Ќm^wdA4/^&X, r2cD,ZG1C +HtbmŮ2}Q%Q=z$1!Z›w!LNJ|yeW֮epH$rvƧe[\s!,2`mnPcrU`tՆbazgN&zhUN=V)+RSwܥh]ile Wa"v-P(V;; G)iP`/\ti .!=i$F\nB_eezCwbM f7hK>mӞ^>>ovC6,֭ͩ[ll1bxUNN3g|YvvAA{%"?%SLa⤉\WQb(7\omcmmc,>~zW !74#S'SKZ[[ڽ+((.***7ﮢ{x<ω 7vll@9m7mԣ_wJ)6+U lV^^|>pd%UR[޽ܐ`)X|^*}1'` wssuss]pAANap.UDQ2RdDi#ƚS?|Oݤ+BHM KB(V̧ srrNffc2i+os]xIAaG޸ycĩDq**9);sfn޽))"C˗zwhiBӦl޴Y*uk͈dH˥K؃#FX`.}e?=˭q3{ٲr>P.ԕWΞ*Wk&ܕ6+vجT5d1r**Gg^=+뢿҄(…,ͻ{y+^933*8._xr'k2)LtPrNߥt(#IVZI^dK.b1x1+j ݤ+>7VϚv|DQ=֗8_)a Ft:񆨫ͭ966ĭ"\($ߠ 6ֶ+OWNERAy"Ԅ2@lmˉERC'V }?@gw믿Or}lzwrBiw*SV6崽|劳3B̾%GY)J!6Ғqc^|N/]ohѣG+fvy !4sflhh觟NS#W:~䨋 B(z[B!0.UŤC)&Yi%Q{gN>t[|G^ݽ>|˞_f͚9qȨ()#Ui "yp`L‘F>}J=#""5>w侽^A&_;7>,1\Pw@x8反ip*#0RXuھ}ǷfݺMV2xkI2|իs%'ʉ etUm)Bˎ;!qĽ4 /Ν:vcK,3dJ}6: }UiV" 4FGG??Ǐ5Ŭ+RhƎ^aϝ=c5r77\.b\.Oe!]S#HDi';y۷o}]]v6~TIWSFM)躰a4cbeeu_w}}vލ1>sQ ;sfjJjDdimm}y;N0PΝmHycԿ!>`'$FFFuujQZZFd,++$֬T5d9ogdokdT fff>p14h9UkiiI&B]ZƠCɡ(=&խ;wپc;ԡTIQF.?^A{^*Bo9:uEKĢl6g?KR hnn^PX@ b,^YN\(7㢣*28^*Ґܿ_DAzJ[PW_ǩ,]TrrSRRx|KNN3f,᮪Yɵ#KU YN(cMFtt TI}'Ml\EFJJJ"8jh5oߥM 6DUEEEm޴)l I`\qqq!!!?7|0}!3Owws[j6g>l-qn7)nnCmr LȈz3iDF[vœwTQ?5xPf_v'{zP ҥsŋ\;TՐEϞ5o>jJUl„"P$ m\9eKٖ}kcmtuoߥM :J*"##kjjG_SStʨvҥEmE뵍??ۋ8YFIR}+ٳwOiIiBB4cggݭRd֙phϜnڮmhA`a BxǩymޠJ cZd"طQ+TT*!hRԕiivvvЖoKJPW :! % 2 ,oxבmVX J#2lM^ߦBt:'V`5A_Vmis1[AF˫fOQsE؆x ÉӦA]KzWǗ?@N6ܹswHoTmg!0m..\}\xy?ؕzR?p 5]ZkyD*-]lZmik?ۮ6w5ߺeo/+%BaN^7mmisOOj/{zxӧNf&o=ݒ?v„<///7(0>cx//O><Ź~ɾys%l6`?p!TPPp8Vlˊ УGBЛ_7H$JJJpsߓ" YƘ_.PD7+Ey**5=(3ZfBmWwOGy *vPHkΓmiGh5 s!hMJӨCOyRRb[]osrn9{|r ŋ F`|ofzWUUyu$] {]]F֧gDŽҢ Ƹo/P1^pٶmۓ'OTiXWW1޾}1cL̴;P={x=zvvrV^^1>936chࠍ6DDF"""#7n0h z. '._ӧ/^HLlđM')G36=z|ys}}=YhhDU?#K[Rb"y \&RAܥ9IʢJ*ƎG$%kjYwe777!|nlU]ʮdm^AKw>cnjqt5k#:tD:.nNq㰰0r~2a[l%7l6_ IDAT.)1aQCzaÉ3ﯛ@BB"ۊhccGbegtsq i6}A555"B555w|qqs "ŋ{xD  ^mҷ6\GN6Ֆ@M?CֻO~aa~~]t^|9ᨪ+zKsXEhU,׷~J"TҬ;y / TyF:UE&sbdO./BOFM|l/F䀖׭mѣ'ܼM\޽$9%EZОg4I ޾c#w>D\h3gϘ2 *FR( y&B@(>@F!n=3=p&yAZ8a -GbbϫFxBf-3bcL;ɫ׮@O?~6kS͡5Hj` )JqM ޥyڴySN_|9O l ݷngccn4,X8u Bڊ%W^8s̗/ wHÖ%-JevhoowLgϟyy{<2\WU>}*<]PP޽{?t`{rB@冄K/Ґ{TZ:d@0N={fRUU"ԈVE**w"K)St0qD.4ΝChi&}Q}aml3!4g*WXdvzomԙwk2BW._9{kopx_tϾ}23)cQtK˟UJ,åK؃#FX` cniQ{%..[XXʟ9s.^#Goܼw_ˋtm…,ͻ{y*zZuȚ5_y׮8}lVV*jD+m"-Jb{WRє?937\WWהY&cMMM7Ξ;w55Zv_4g*"@NEBﭠM~*'ec|I04Ʈ66\qvvF=~8z؛ٷ[sll ~9***76m9$8h!.;0*ݻ:ܭ[7Y5’jdݻ8;ݽ\iJKKƍ{:tҾ}G*>3lp[ۮV@o611 ^zRhJ tΝW\ǟB3gƆ~4UEV˵Y~?rhEEEaOU"ԈVEjo}}}pPpn^bVGG'Pqqq>}ԧZ-/YU5挜J25O&Piw BD_4Ws‘F=wV=k!t3m1\Pw@x5B9v{*.ncmEڹ\q 8!T*%TVV+yɧFVN1%3GG??Ǐ5Ŭ+Rƪg߮u:v4M[Rlxp8o]+kJ t1<Fsk^葚ZzWUq6@T%BhUm_,ҢjJSzիsޭCoV*qiog1ղh}ɢ4gԨ+#P!@݅Rŀg-2VދDX 2CTZZF---V~KKK[IIRoVVVǏe7yʪTwRѾxih̞Yrr}`PXeڽc|왅ι77]+xРffj^Qbd)--C2LUS%ZU( j3gFDFzzzˉyrmR'V.Dih*ҮW]Ao+4;>PJJ ycƌ%e }0jTRR-1)qфyAamԩ-*.y,߿7ل'$?<}yrJҰDUT4@oD7X>>BcX*ѻ`T.9wU:q}{oITUZ=z f Dk#(Jۻ d1JJ/Y(0FNMM|>?%%Ece]nJsFre(']4vfF($$82"wHHΝ/^DʲKlо}C^d >{Æqqq!!!?7|0}n ǞHTKJT%KN%K4g&ޭϟC̘>m՛ۤw]o*~aaBH(V˷dNf!} Dk!(Jۻ[MjJ[萠 E5YIࠈt:]Cd]nJsFre(]iuެm\Ҹi04h4T{䉾5jٻ4!!AߊLC07~!0n\4أG7o3 gss77 sмzW0f4FàQԻO~aa~~]t^|9 w7#ߟ7g(hOyc&ŒbhBfT>@{!{9wsuYrڴ'_`Zmo#Ig3Zj¼ܼa.*T5Ç{nM+{cqP(*ࠛ2,8tcǺ@7꼂Sc#Ey?Vfdq憆+W644t !*--##d,+V,atqo+080X,#Jwڍ1:ݻwݿ2c *UǏ꼂a% @ [W$7cZ2ݵS?=z$1!VVqu f$ x8}LZgg癳f9:88lSM˳g8P7 ;)o c 1={P;'Bc#N-"5u]!! :@PԼIohhA}6ϪEG>tgh9wh^!0&VBS_C?w~&B,Bip8 X&&'DRwBE?RL&Sj0}GfP/ 21Vckkk+r֭~66aDz*ooo''Ǚf}I}1٩gL}\j]AAvQQQyw wHÖ=Ȼ\W19` u91P xV]ݽnBc}+h:vF6i8!NE%['33r*0F7l9y77dL#Bϫv3gȘDA]t?=8bĈ k׮yO>574zԨ={w.[XX꿚 &ԼyBŋ/_|+zN %gdQj r}mmv!11"܏9*҂Ͷ\j>JcVB(##kW>,77p?f+WDϚ=kϞ"!=.z 6dZ9k"P":#%O.cGeyT GaR)`oOc5 :wD؍Y,XL++drtp?~Q/^Z"y huZE;_AD<_AC=FcĠFv2WU=^eeVVVǏecc#wf9;;#JKHw##zcccPuu5*|hJJJu{뫍ٳ?KNN b2Y0ThcwkB#b0B$`(}aRjO:uѢE%Ebf6p=zLJJ yIIId(oo-[~Tp.[JGNy O9OxL8э2dDGG0`i;wlcc&Ai4 ՘IW^^obc2nqqqÇ#ܗ,Y,$882""4/jڵ'N9BIwUȉ#/̟>xо}mHg...ۧk80`iC:tXova5"{?'`c|I,R_i4T*M0W A:h'nUP^LMɓ'-{)-)MHHhY@BR%ׇ\nmmaBqqq'M"ٳDef_PqF]}a_@kҗ5/}1ws}nr ]$w1y :M@_}^.sأgX,nH4F3YXY[Z/;zeX<UKV g[NJt6^5 ud9Y0[MB>taZB ,eC+h_w++++9 K$HoEt:FQTLE}^) -X,K$v;wѷ.gOˌ=ˠy +? P"[wO۷;h4~+5XutvH)~#MJ͕y]bq};]bX}^ -T*yɶZ@f噚Ru.! )T_OؑBwpqrâ .*z;A*  BH1F5ArFH,RisA΅ UDEĸN`տ}Eřа=:R+05}^ݝ&%%T8x7n2o޼аЉ&6ơ]2.~uIs<16fvct{jbs֭/**cǍJ&Ut0в4oGG>zt!++$ς {n.cƌ~zyycyy7ƌ[>?;9ukwۼ^?'mGV?/"aCS|-[d[~޹ ͘WJ@KnAv8cD,fݺ>{_,^VZ:{,?_ߞ=zL>-]ǧo>۷m#! N4iݻew5iҤʊ z==<ϝ9bDoȈ< ٢VQLN1ahF.wgQ,"cv)b-^ܯ_?&c pw믑=G}{wP޻ww 5w3`4oǚ/mֽ{w֭[sss=z&vZ9ׯycǎռ|I\9vɓUE}ΑGc/]:o޼[w+'~U7W<7RsLKKoF/NmɾՉPԊV*$r1J$;:t&”R>,LSJ:CM6/ ܹSwڵOKKm[ϓG^B)YV(t0+SԶ]I}d[!Z`LTɨ7ieY?ֶmBHZjjfVV׮{h[61d«2]G d$sK6TAz WPQNwN2cS _P2G}ZѸKpU (FmBذaGƍrwk󃅅,WWZ>ۿ~Zj}Cϯ,)ڵw{).&yLor!%:hIK]̙b%9X$ 8=t\+w%3Q-jۊdWBVp(żl4[PJGMP-XUe M9*V3}Qb (+N@qH>]XLDn#00;c$l0FaRzBQT@65VNT)cdR(6q೬[,_9!C-j_YYwA8O8Q2>o۶Bșgi׶+ynݎ8>omˑ[n'4ܲJ[↻)ٻdl\H"4@ET :Tio㏃{=^lIIIUUK.޸qYg!' ञ6oGGvNn^v̠@gǦG)uYE8[" _պSx<1HV6 Tx)b-;@Ν`msNu6ei%Հ"63j($\͠Ak[&d _/ vxF9T%\VFVG2 Z l+Bvb:($ Y uD悙kY|ʊ%K۸qg#aIIIaaa~AA^7oa;7/u6Kd/얟߳g͛73!9y[FB#ﯪZbryy[mŅ5z%g| F4 ??^29 C3k}@ KV{%-˲)ݸq ַo_;:w<˷nݼyP8P椓zy{=_{=555XslA)xD=/[R:l1x< St @݊ iӦAN?Νۭkq.>L]vPk]tڵޒN֭~LuK6hK9n1DG:v}h4yN:1!7mdBSeqx-o)隸g:zUG 6nX~.o߾;mmێFFl8fG JJJ(Lׁnۺgqnk0 BFE좪!38P Gw8!Y8w :B@lF[?wOB,(>CE,6qC8}6E,i%P~/p`B -BRX"l,Qfc[ |p#%@(Y/@Ŵ9:-%|μeMP,as9@*RJ!fPw@9@*myk3Z܍9}={6#2`5JNQRRҸq_50{< 3ÏW_yeޛoϿlԨ ''`<=zt\G)}gA~eG?-#hݺWyc޼uUW3Uw?QpZեK{SOe}xwΝy漼oK./ϛ7o=Ff`%O>)7n30BqHӒMOrKAA /x ';z>m!C1d@q.y6MY޶y֮]:33O>~:Nxz4I;&tlt/Ν;w=Z3fkčMk׮=i։wxl۾C HM:*dXr3mwMcX4(㩤B=C!].ЍSBa%wK yS-R Eڸcs . [JM|>_uU5wj׮= vj׮=2Q%M,䖟x1~„nIbO0n#y, IOF)?n~v{~nm2ڵBL:q&+(m[T:]2%EHuuU R@J839a9\z鈥˖Ï09=X~}nzW^v~qo3%ƹx?O=$|ĥ#-[Θ_Ǧo񒥌ys|O?3mӦMwukv]/x6l/4{Gt?^|O<19LȭS\򩧞^tٵ]7WN{x%Q3s_{mҤx;ヌ 2eڵ ,m7oʮ7oٺif/.3<\Q5!d֬Xz%^:u/7y.~\s3~;m۾}pFmGm;Dp( jkkv]m-ooh`42*/ 642BP(dQ00p(BP(la|0P( E% "{pp(D¡P8 G"p"Bp$e hߍFaVeD#F#h$R$awYu۶#HԶ)t \#賃g 6*@ -Z/;+++jGԶ|Vr %;e1!99Q;s?ŗ^шf̸ JD(Q62W3f>Ag zi/喍`0`ƪ3l+ƛn'^o֑#GDF, T; w K.*BʃJBpFF&Dζh$QWUp8\!Cq͓&q7oLnj%ʯ17$7ߜ4a@`옱ctӤC];gu]yyyw}hO ƎΜ5 {|/T;um{u׷*(` 6m -BlMG 77آƢ׹s7MJII7n<꫸GSnvtыIT 8{Ezҁ ㎂lOࢄSC(6\mѨi1+ח3| hVhĔT:fs m B1\G&wDA TRS:%|Vqy%\s͔.;B)9CKvmO6-)Í78'FѨ #a|\j۶#IJݦo_6gKm?YfN|K~~>hݨ Dh"gΚ5[T ;H+t>٣uyŜabssŒ62kM6 hm+)ksBԞݻ٭oO\wݵp\γ>Jwýٸ'zp͓~>[T[/9>cosQ6H啖\Q +!g^㎴),I~?pS=Q8Pq&Q*Nnq:@>?#4S4J!<-vܣ/"R,7PJ""*`[ uJYcQԵsdT%bjB|03.\7/!۝ZE(>BYRbY!; |uzA(?)~fm9C,[%`3\y9ΰzsN&%0幈 ih&'%R>g,^tɓo1bGŒ={^xa8M{ߝ&433`ՅY_|qɒ%>hѢEs̹b!LRr8>ȀgBC(,$BGf|M)#dfeI&t|?3#ӕɇVkPpN `F/<;;Ow9iM<:uag R1tE4Q3Io\cc[ycSfΰ:+;[4kF rڶٳg|͗1w3{RmY,;j˿^-3J)Y:ef#d¢6YapjKP:fOOW\}!#{YYYYWW諯* G@c|ǫUWMp'73&++**{l*jkk⋫7lн{SO= p@6\܌~;nץn|DMi M&8 332`B'L}o&oڴi-P(exlU5 .;v E 5sNGpԶš;ihhhjj8:\9Qn>0kޟty<ǎ`Po\Csd&p8Dg{Pȩ -ς yl>sHD2ejHF"P(q)D?TcrFQƃlNEQ$NlRR|*^%!$j۪3Dhn#sYYHYB"fϞ}WxyTw 0μ\=!0p;F4Haۻw={oHd'N}HD( L ׳>}ʕ+E~^KYYY>fvETQ0\f.+3-ii{|̘@jʼy>#+njIN ]qŕ (/3&x7>#99o~W`GN o;6x :=99_~W^9uK.yV\IۯAPBar9sL8fI^zs9|ȣw=_|)M7g?CO6!EE<dddу t`7n\JJչsO8 99W]} v)n׿ugۄp)RVN Q>Ęy" A.ķ *qd]MBd6wJ#-{D>bY|ܞ͓?e p#bE/Y+5rNlV5zKgp8#39fU$3g'%Es W^sEƑHDQ m~e˗|rOGz^;u5=!cZ7$sȻ;J Mexȝu.aR8nen`'bs* Ab@0 5uњ]^g?هIˌ*2)zOb ?ią&V cbGD glYPOȌR8z`gljXL?߲}9rn7Mj^6AY c Ϙ|G(q%ۍ챆 ! ŌL3hHb@%K-]zAlQ>B~)wlAX~R 78rBDH ,]4Yf̻U|;JZ^)T`Dz_|9S& v6^v3ptHh%_p8ܧo_g}gݻhߡC f0ܿlݺRܵ?'tOѣA IR\6ܷeԜx@x$6+`6*րʔ0)ɉx)q"V)V'gs|@ѫ l7_~I2Wjt\^ !WՕPWDKK`Q"ڋbħ Nx]#b)bpܣ c69"QڶrO]QhҤ>}Y>>BPl/EgYAG#BI~$}@ H0PZxԈpJp؟$iҮ= l2, #J)U0GFWlݺ2@ogabgĈ8,J#>===9(+W_m۶ŎIɝt>rssáp}}=6 !X<&(*tinEص5z4ʍNrN/2u -=;ZH\(D,!"U:{:dyr;񒬍ke| +/EPiM9:TݹeQ 7jIvSzb{;=ptNMM'%5 Ñ Rs52ZZzzRBGEZI؝ܨ:!DeV^ə;:-i#P]m-^&|ۛgc04kMnJJJZz:v4ooHKK R|>֊-$"N3QMaupAd|FaF]?~llc7 pfls-C HDFe?b/Mc4v<5ϒ/ͭE ]܀,6qM0B&{Oa̋Fc䃅fQBá! @ZzQՉgx c na'O⽱8cDzz5553]: R]`SRRəYYp8\WW>I{F=bnHb숼@Dmַ/'xE!& Be6Ҽ?bR}f7a@}Zt(b El%Ƕm%V*{ҕ n9384FHxq+c)!- "s=@fFfffD"PPjfQ5ڋtkQJ XQZ<:|)Ew]<j!ɔڕBDWxVI anq6~?b/odUI1tnutC7jkQ G8fBDƌ;RLq2O_K"+:F`Tbu@ 8"@]塡ZJi"l% ~i= K}J' ibȖJ"'`T&D?܃K;('}:Bdv}Qa?9/"!957(oI@VM&`? 2!p@Cم0BĄS,?O,`gki" 9wB8q"}SjQp" @%q;9)2tDŽ8 ps_p}CUi DMwi: !=Vp c&P 8U y38y٩(5`wh8 6wC G',y.'*ٹOJ  eYpbJB~=42GnOQ Pۏ :@+tFܩ):תPJ._t+*psn?}b^PӘQ@Z7Hr^zJcQCDtP|˻Ꮎ%pDc;6p!h} v}E2H4J4).^N AȢ\EYj?ۢ~؏$ !x.?sWQ=6άW! ¤z-vfL6;f|nz['lSS1Fˆ/mS家ՠ^S).dc5P^܊bT76oI*I1`v9,)*wA.XɯLxÊ@QTO0[BnkEhpP_& #hRd 6ϱxig e}zu>s4U+$_QR*nQkz65d ?9/<1U4MNNmx3*ʀon+ {T ,>W7E9o67mƬ-\({zQB,9dH2-Р PIKo]& Kk"+iMmAC ƄxI k ~+H 4=0)ǦcA"@¡3^8)XReF2TH l/!Vxc*TVndN;*])3Us:9^KJՅ،#x♽o+K=k~< H$&*}=b]Q$m6j&"֝] ae5i[mR,+Xl,`L:5\:0XBʑL$dd~(哽KhI:x@w>+w+_7%'m < 6[tÕHdWe\W SDy:aHFRtx͢F@ ֡WQ d Ȏk" inhhɩ`&.э+jFVv254=psl[Q*A~2TY&ew Dy` ; ŵkv6ia:2(kՇ8?*5£Z0݄(ذwvpgNS+/l}8J-C@pԥUJyuDnT\4T@[X>]SL!^M<#VT@ L#xP[ɝl{WsN<aA@?i،:{2:$B#=!r}"G:dlcm%ml m,AN*x%7Z ,T)C ufi,@iO375cX  68Q&uvf6@fYky D&BS0 RBLb0ûq˜@NgEa跼ю4.^F- #r>y[ .,~l}^ Nў#<(lLL&}Q6dtWۍ6voYXng\A8I,e p2)'bC"cCk; DQ$yq`1zފ#0{EcT:s*z*M#gFRL#h6yt Sߊ7uto8͕ 24RC<էw䆄 Zjro-7Ͱm߉FƩ))%4 @NLK\Pg kC.,27h)iC+ڨ? v&G(=zy W9D5tbSQgB2孲*f/OHotc&OS@uD+%Y1bᔊjCSVmbybS=0)x/dP謐knzr$ ~&pV[rE !~vL pZWXv:cBNGg?`֚TG蕑1nldž];sVqBkRMsq E-I`/;!y.ELOHL0Jkq~NL\=ʍb/?{8dPR+5Q F o2{}(hrj$'^v|IyFYEf?.  UF51x`3@xDTVXCV[WT:NSC T:NpmӲ|%d ݌^[9_56rG%W'`EbB%O:x#S}#>:ULν2!1nu͌zFөcsz`2^-ܦ$aXCVZ.$wR49?{rӠCӱMxۙ_12r-M#P- pNS1*oi,OQ#dꯢ_=e_b҇@gVy*n ,{7LqL8*-P0RnTX4[B-,D=y&MK# xE1kM7c \Ɨ( ZhoMϜb]x|ۍ:{<BpLarI$G&bk HeS09۴.Pa6Z[ȅ>lHBE1`d |G S*f.*YR?ͮU”_S4T4D)% eJ Aω@YqftQ"pAbJ P +  Ųr0BԙXpk[)0IPV8Ŕx =mtp-c&k> E;A4ऩ'Fs/\eDB]gh&[3QM" :wQ8x"Ir^.PqlMG4|=^h G5ǸEB'A33^k<*0c/2bHPEclG169x=‘T&fj"Mdo%#J.TPf6U)J "y(7A36n JʒWcx&ggͪb%)كRH@2˃26crP xtƉܫٝ8q\!B OJ,mLRJ@鯚yaU30 hXkjj`UU|]ӡU#f,WnpDx\pQ3dh'A04Ԅ$KPG)?5D&3UaIIHi=A[j+@]g"c;}Ȣq:q$7crF{$DHVVK5HהMљqL3KQ]LK>(IXl8ƺi 3$<<1L -n횵/VXaԦo_8$FN +47P, $|(5Fx \xU[l K)B,^v mV{Ta碄 \nUbԛ&WrPR֓/w,%(6}MEBDiT41ܓLn 99nV:h2 f%}]|roXj5kF999C322`Yٟ~hEEm~m"Re w[޽{5kEI^=`5;Gop(%aDw.zcduu9%K9^+00*h%re"͘dL [5[~P=t6ug!$7%__hDyӤm^{HD IDATqtxVxg߫o l:thi!Ƿw-ǟ>W>0pEt[Ķ ;w5\rղe/Y$x=w/XG]t̙ڷo'`{ς G,Y2k ۵39Glzoɰp(ri*ݢY*x(CItzg*9R39-bcdLT n^ *ݶ iH׿uNNF׵pHh<̶mܹ3ϥ_i¾eջ룫/+S؆dgWf<~P$[ !@qxѐLO 6DV\u-V,_ q#ZS0??Ls,YjjZ"w:@ Э[~O 4ԡ?F^v^?Ws cSU4/޻/-[+"̣Yힻzw/$OyﻏΘܻNj/^deFy`L!|֎[<r ( y1V,cjS(a%rI8걈ʕwVTLIq41r/#ۼ/]cmd* p3VW{?FAoL*: UfJMR$G23SzvbSL{ܳ.y'y`6D"2yVrWTT|>V{7?/?|=g+xmJJ/7|b.+oHKM=s`صk'G}ǍOII?~HK}C_&7Y16KW]p؀ƻƬ%@4 WEY! >b#V jO$S'OZ'ᱦѼ JII1<^ C^?)~ʿ\9dȐA>[z˖v>}t>8 {RkӦ RJYFyyNг݊A#/l'*WBcE2euc[뮹[WUxc@'oy%o4{訩̽؜ױHYg~ wNQU6;"+==0|x!3/O휜ξ}!jWF.D|^'IZmw~Q2999UUUYYYJ+WoׯE]t9gHO&~~֦p] |j U4Z*))8+EQdjtׅ@^1ܺ1bn_$blC@x$<0J/aҦ,(+I da#5/,YR~^w#D<%wMCK'pXV_8ˉwt fM&YOSS^Kw}p Cs;9kfmmmmmY39pܸqqYyy(Zz5Wk7\^^׬YF yob!b꫅\P@ػڂv;NԃTU%nw> z)h \ ~7xͷV|eJY!ԺukC0[5S}(߷057%)bG~˟^y/}[ss>[Ю]믿a:WOLYYY$ɹ 2E_oilN=zt [o :$g+حk'^;s~{Lx,TbskߘKs^RtÁc^;HQ<#cDM1x1ڨ2exzG6Bm?"MJ‹ •@l\ }[/Ls'[3MG?7O- VoFϸ󒞇HL?k'Zu *!`G>Zku*jk?϶ M}{߿-Vz{^tNA^[[{oYI+0qɁ귌wAhT3vxzD^e`)8%FUS4Z :4eʔp3< J;Bz%x m΂Rva?w<(,)I~?kL%+)uਡ:OfliĪ fSS' `YISlN8z_x>!bFߤ?@?R9?l<ټJEf@T ɈFkllL D~H;[ ]1ĵbY|8yOZ6dRoɻswZҷo+d_֭nAB'7|Aa-4"Z!fI$eQ`Wjz(CBOX%leM< tX);;K.ZZn]U@-@O0(9>΃ 4T1:^xZI׏Xe7 SnxO iE j4NJPJ/ / wA??÷TAF +,5+kjcQQgz<{ :|T]]]QQ[lax "Z B.H ΁{`CCQgRc5 O<+"Pa*زj~k݊޿}2#q22B]rg̋_Ԋ g^YSe5h 4 Tq~#N u O/K(HN{ "7^WDBp6MWmO7~Wti#M!xND=01bؠՖV!m\RϨ詗* :k_ވҊZm?irڷ_,kKjMe,:zgI~b`"B }ۤV֖cцI߽WxsY$Qu12F^H MyF10c%(T=W_߿¾!77DfD)P N6jȁ?m>$8x?xHdtժUAvM0bE|YY613v~~ONY~tx8:' )~ߊǷƟy>lLڼ15c\CoN]]]$ٲe TVVb4 ^@32*RR(Eu>"9z^T:&"ѵK>9!'t3cC"?oCaf?T9ƌ8+&0)AI?S8rUVn !\7--###g5j5$ߟ$C~6tR*ZyIPbhdzM7evٿa[V|n'~uUZL%(A JBG;-\♗W'%近СпV"A JP3?|}S@%(Ab/-?KPwR~:3Dk%)%(A JP~ %(A J/~Qx֪ UA"A JPtپ};smZVu!ұ*^ JP AG&M_׌gܵwC%yY2%(A JP~tlWO>ɁO>W^(3{nm {ig"9^bfmZtkv+ M:<-%(A Ja#g99p3ns_-))}o{iyQG?3f<"^bQGo۾cKs6l0YO<>wcƎݱsUW_}xz%(A jQ"?euJ`.|vϥtIf7Oe$%%=ēF~ܱce;w,帎/xB+v ^fmQQQ8n[TH)_}N{5k(,,ܻwo^=9͠G^\wG8p`55@PxM&^^32zꕛ{0OKgEs=묵˖-o͛mևz={;"HJJY,#lݺxmXrU֭ةMPtLSuMʕ뛝C)Fp%;THsᇢ/82߯O;W]vr^լmv;oqVG w]^^ުUאBlԩ3X JP~ 7oүo_H$ ZnRB1ZYYYo_ ,Ig6p_t?C˗!C٭L?}v%[YYY}6!G/.11aiA1Z c JPF^%VWwHO;^3ӻWUD"x0I@~CF[L2{O zunvO>Āu%qmݾ^u,>JKKKMM%  %(A-L[ՅEEh:TDRڴn]ZZRf7͋qw+ƎB/믻%؃+MNN~g~ܩcfffSz%(AGheUI'T__*6m|͖[&=pEi%iD) 64aR7vdYjU^=g͜ h::owW0p8|=wp]<ܳpmݩqڶ1Ҳ#և%(AGh|?;ߜ}o9jRyMr_g#G\%_GPO>K/L=FBн+==}„ Z*?[|,Af<ȑ#OݻwJmcرR}%<իٟILPtLB(OvEw}wrr2<3|BJw)Z*?"cRR G}_EI6mV\Ut_e;Xە&jUkPlmy%訤\_zQئMa6ݻw_XG}t]w}]!{fgXXڟCѱO~y ifmÏ1|EHtpr#>Ҿ}6n|^xE1rgMOOOؖcCCC %%%%c~P+A J1Dj7ØaÇ7ow.m׎kx+^ͦC7f,,];%'>Q(ƒҬ>hȭ6曧OKJJL~ߐ3SJo6V̴}+wpÍϟ]JPt̑UqSyy7|_;>2wf'M# +EA@,ȉ8iRc)(MSrT~)@BKBC֙1ɲew%k<3|yg<+dܜ"ɩQs}`fC_d*ʥf}eÝŊѢO,rux9.\=:<LOKK^#+.\8ϲXbFr&ňT1!jjAUhN ̦\u ɢa%v`²VU(zZR:vl ,ijkBܻ.$Sdٞ~xΟ?>3Mjǧ>4e֬e+cFVT*őaG ^/5ĺo>V U|2%DTSϖ+R mQqIsg̜յW_gw׭;<?Ql; Qp}1( 3x%R0#"O'lZ/((..Z km۞??`@n}Z+٬jvn{<|ڵӚx4u3Nܔ"C/՟zb3vx3'ԁ:PT*?ἶqB# 2?EqϞ̞}*){ZD IDATxYvN<5I'SE"õ %W @1.S@t{1sQ#onpWȝc|3336oldiv4gm<9 H\%mx+tm9^yϛ?&Ng{ldi-?%"Zr8ܜiYLDo1]#@WbXL&SXxx@@ 0,r _Pd<MI72_ӌBΕU$XLl:`4`k_aL|UUUvuu:7Nvꤟ othyтhؿԇz+LBDD݉1q%QU8QM_M"I:: @Gv} ٳHK vsY}o?~ۯvݺ~,ki$}9c?= DV7""tAuQ?,5WXYl-KŶg|6wwHmbf?#"ztO3.d2~w>>>ӦMfKHHHHH x"p;kopt|kS2b= WWqD%Nsd2>ľ}zMkh7on=c{̟7h4J麐֮ճ_bߝ;w[.!>_bњ\3dpdD'O\2x4юWs[t_C~ "JHȰg1_HΈ}gX!"'MKԻ%H=~?Y8իV9zO?YW\999W**.ŋHYʯןٳ'яѩd* ^ PMDW3;YXX#-wݚ^TTd}۽{"@"R(qZ"R - [FBBBrsrsTnNNl۽# z_Cg~ig=.VRfPfRn e"Q3l?Dhhhvvl] "Ng}}缒U?5>vիה\j.^tYY3iSXw1NiP\j Qgю'sﲥKKJ,^lM{%/^h= 0 .#]__%ϙ3_7"yĸtME{{淳b'b fnz5RlGiՠn*":[`0[;]!Je#ݷֽwLJzhQLD;wWP޽~QFDS|0婧Τg>s&..n&fG2vϜ.lS-[eh_ݑZO8+kGV{ddoj |59Ѯ]|2e]DtQ#G~[T*V]tپ}^Cwc|(X"bꍽe5VoέWn]|7KGxx79rÇ̝#GtDou1ѺR|3Ͼ|cmSv>GD~wZI^-oj`7c7 V~∨\76OOwU|4-V`vG?o5fdk[Ffg, #^[vѢ RRY+Vpn,d $"QW\)ȿP(d2{#{|g{pCIA,!ў3+TaJ":Ufϙ~{&NϏ?)}Q/JLD/QUXl1s_~*<_UUkj]]&>u򤟟oGدl`[;~`]0wKmkLn SwSS/ SxsIX;wܹsl۳gOk~n5f̘1cX'Zxʈn<5vKEք_h}|1V6minå;Zq0H / |F.$lFV˱KўG7à %DA0&YpڽyqqgϝsNW D&`0@35u #ֽ'"L4tЧJ۷ɩRg6}k^{t,ZE"ē lٳ ڹkԇyZ:M]ITYEP˙rd2Vꥵ3@|RuAQd&T:sl|Mio}듒?w*MːOD ӆuʶ:?s@g+{\ċ* ]]I6ѣz-)e'Or??˗+/&MfH蝐r6GUUgӓo,3ZtC)c E~Mʊڇzo߾m۶0"zvqƽ ARjզL2nukDYmҲ2??RPP0vX"EQaZZÞ^֮ճ_bߝ;w[.!>_bQ`0f͜طϛoΑhE}.v:iYݻԩSiiigΜ9}tMZJV*昈xbEE8x'(**&VvUUNcW'$G4m sףGJՖM\ljM6nDDgϞ}&E8VݵsWbbbQGMK;sLhhVu|"b 1|/+;bG5[7ǧ3pK.YYɔl,j:22e3g~wWW#|^Lh2F`z`0zB! fСC,#?请G^DEvv|uQ8VLtLR0pw.\7²VU(AAAJRO۽d&bq\QQ 111J>iH+H&B0tA# \]$nψH.Ϛ4_k͛u!a~}ϛgBu7tU(nڸC##~"Ejψq),,ܳw_%K/^d)S2sH6_)_~yӦt f owX8PT>0y2޽v =2_D4j:%)"ڶm['w%v\bx+V'\͍gMڼŋ7]7(>RmۖطR4}LU\-YW%Ç?l?Ïk_dD`"s\sڢ6~G6`Ŧ1c:t٣57@<ox A [S (D | n0DZ,6sx|QQQAA4Y=8 t9n13g rlf"a!b 2QfzVh4z й1MflbaXa 5ل7A"^ouKps0 ò,0YVZMX,>$gL:|{R\\J`KA36.jJn:b տڝu{FӾ?r0Cå$bTtRdثOql@=qP Ð( ^Oj4F>FRT*EQF.Ž♯oϞ,w)|9SsD$8._RQ]ݏ^reYxf4EQTR=$RH ۷ 5ed^RYYID{쉊 ,++3 555}JRTHsxVE??^NT GJxBBB&O\PPPXX&r}}}d27>Lp=3Db]l6GD]DQu.6朜iӦUWW^x1 ՇN̖uPP:.3{]l6KW###kjj8۷nL&t9Rx_ƚN+!CLRܽf_ߥ,hw^YY) /b8NTfee1 3dȐ@U\CS)*ajRBh4}j]Zl- `%8{d2˲$l 2Hd2rFׯn1)={߿bmH0BL&hK00 T*9sjmc|x[Ϟ;?o[v3HJ5gb^cR{]">cJ1c&wm7Ypѣ(++d20EEE7pG ^-'.k!"I=*~U~~>N#˗/nADH"- hbL6) |С~:n %bO)ד))gϝߵeY\fѦF hԇ[J㣏<ֿosiUח.5f̵{y>M6/\hܹn`k׾:kN}>0uÆKN:toE kdk|"|T*7s檼*}7Lm~ߑ r+~|0 WV={G*nwJ~@W 8[wM|nj鞙YaCY?^^^suӀW}} c6m"wa@qf֬O?ULHWkt3gd⸸:N*++y!!!J2???:::vdȑEj. O9ՇN3w[\زE鈈К B]RRRUUUXXثWR)υ 8u:a˖crٷs4}ꠠ kLEGG+++###-KUU3͘q[k16ME.ۺ*>>6gAADԫW^z5W`㏗81]r[o o2gQQ02 }]PPPeeRTՁί8;~- ]w]ddd #  ^߻wﲲ2Fòx@?ST\Pj{c<8:|~߾}[șEDfYR٦T$"jR w qRX,3AF.d25X.˃`ZgUUU҂5@񬼼\ZqmM<8I ծ dz"i y .d2\~ȑ)S r-<<[n!VWWi4\Yuu^{ʕǏǗs q3gteee'On/o,..vr1꼼<\P(ϲl jĈgt",Z+v8&:r+ų}[pw/LwΙcM/,,ܳw_%K/^Ըor 5n+W_^Zꫯ>p=W_l֑ ÓfW_m =2RST*tӦ .3wjgn} &履}GQql]hv~9dre)__눨*Gw??͛_SSڵD4~W9[Rcǎ͍5酋x Y+ט 1_늪kxdIR- .<2^om @Ϥ zY"te@n?qցLw`i.{ΜN5t?+(,:gloURRiש2eY /^\j(ºu28",t"ZxIQQQYYYj2kQF7O?bkÆ T&I<V5+V,wґ@'Cu!j:**ǧ͙;s=/g}i ͙;WZ'P[nF@냃]]xyj5˲U2bh4BxX;RTWB"〉xy 4 ˴H:uWM y?s˄wj\]WzŝM_;B_8j{0.$LG?թݩrxU: 77@<ox SHD$1 HD"$ֽ!Q!F60Ҷ"Hd$brmEњ!kKVDFMb-Eeh;UWFEF:&&Lbmm`j+bSHumXk 21d[uU^Z/mWkՕEHu_ p XL.0uoaj#2"CL2e|JbBKjT ["i_Ru"jRVU63$ SWڿ0Tw֪֕ZWzoekbDHieV:le0'~Sh6j=źxQwӑxV?Z;ox ?Մ_ݤFMlY5S;d qMp$4~iGk}JёxVUU#-z}Sz>{zLO4m_<=qH*pEVws)߿6㌘&Nvꔟ6e-@DDeYeT7˲90~8.rKBs:;V 3R+Μ!er>/vh;='3`2sOeN?fF3!3/,)d"o14^ŝ=wÛ Dfh4/_ZDQj}!7tط~bg善twyE_:=jP6p_P rKsw'OS]X+:ө V߰0a{M^~9IS9iqA[y ? $+(7^^67gx]>ڐn:ZMi6խKն^rl^,IZh}tsf>vݭYfㆍgϞS[Q- iX_ͪLxrۻg̝wKLs.;{ѣ9K5* ^Ul9mF6j}$ON,^ ?֯?ǂ73s>~ܿo]%&u?‘gIÎ۳[bX6Gqkh =9*rc}~/2PZUΣmi}oHIJl_M֙CE4Ѻ˶P`ٳ ڹkԇy߂ACtF v~"+(2{F o|&s;vl%k_{k߸iӠA #ϭ}:Σ-ͽw=K["4i;IDAThT/g}\G,GDG2_;/ b*)9B153c&N4}RaBH #xȑ yƍDZ$gOưLD$)i@sέj!!>~oߐ4pE v|pD |E~PUK.g^ $JIޚǎ/1qDrg}kgKBsI^yǚ_PI!Wp}y޼aϞ==ƍЙAk[oXS.=s[T.商z⋉'=q_|a;Q+IIIeuDf$T4/ht';O>.=Xr"Te#C\q6o&e'Orǎ)W^yA"߿}mCZ@>͕sERr] }res7[(ѣGqh -AD"QJJ#>z_9x066vUMK"=g>r~xqǶ$4-'߾3mN]ֿ]9\{õ‚O⻗8z4y#Fq_O?;w_H=>竏>R擱e"QAE-O|ʮKν{͕`4v=~„ &ڵh2|~h!]?v̘O>TJ9 )KO]:G'RKJҦN/4/c~i6 ,==:|-+~|vmK.׿湳gwرgb'%GgIÞikXm_R'`?#CYPP!rk;!eۗ-[<`]~ ZdIP``P`%KUa- |҈޳CkM%곅WJh.5UHIn{^"O+6o*+*^T(|}?~nM5ATDFD\‘- i_'6ʪy{R*eE9y?'hr_#e˖\2** "Q|ؿ5ꏜ>Åuߴ IfHTOmlq?$&&w{tG{?6L$?~ /圾OM~ JGiĪғޱj5^Y~bW RSBC*մiN>-wQM]y-yY+`BZXEAs:q֭ӊ#*x\+V=Sk⾏Rpb ɛ?fyr߽y/B1>($(=p$ȝ~Xt,E.K/7}]e3WUU :q\KpH𠺺ZB۞.\.0ݽtf[ЎnXj:Ȑa\jk pΝ=jҒRr-i k }nڵ2|?2V{48;^"O;h;@ёœc#R |2E]}@Vv97nԵkWn &$g;{#1|Uu塚3ecV9Ul]&ԏ۷He3Hq?5=αq{~3d'O|1ZVs甀[k e3Swv9nh|su^%˖k .ReMT߯|!XRv챘fWxhKhBD!l8)\Bir1(.W. O1 T[r>< ;AAA|(cY13_5֕>%?՘>}~w?󡐞 "62>c4$}{{W`֬>裾}DIiklcC I<n..8WVڥk %bEŀm4V]<_QX-]#<pGQI7v - -xΖyGNCg{D\1Y-YآOo.p - "ZR:"nQ:/XC h _vs& HIದ%:x8%extXfTrF􌐠ċAʺFRTD̾;H+RI2H*7gcƌY0vmqʕs4 CaٲdJj782!g²}W]},w+fci Q$座ͷ}V0u4 0VU$ŴbafVݸqb[Uh"xr R~Μ9sˮ^e%p:}$ lQeWN6gNYTvxRMܹsذ䋗._SRvxك8򇧤#TCՊl 6M/`Jjׄe۴Ygk\&Oz#GYmgd x:AJjjNNw߿,7ڮU AJhZ*IW2HD``\7g'NdǽwOhL=&L9s{Ja Pn,!"I0~ M2eL7(:t^)2ٽ;A=7V99ss?yG>>}O?,XXXXa¤?s7)>>}TZdx" 8`ͪ+|$ `9޺v0idݟf=1FNdIҜ[neee%⛵!o !Ijʔ)y>An>y/oJ yW'6Kg^- ]ر cAl)×.7npθ ===';w^O9@-{&B%ov}6WBS>.3LrŊ7uiq+VPӦ\rDj ԇGHPZ8e͛i15Xr7n5])lN c UYi'l,Dbh߯e=Ray!K.vuO {["xs.((H&657/_&{VttZO{IJdl4?6*:C/$ICQNF|IxDph> }`Hܟr5 B BJ[[3ć!)?Lr}uMll&"K>\vT>sRiB.^6zP3 :hgތg.h4ޭFskrJVr [_!DI/nC=Hx4qBAQT`@b M2i]VWQŋPjD8m ^>߈aD"GF_Dp1ԃNFR6ߵ$H[@x@ gx@ gx@ gx@ gx@  @ /*f… 6z!9$.>IV]B cfqk}{9>sU?@ ^493F|~@5]4@<ØbH$qqqnKSzYh;&@pbX@U_kPĘ@pg,k߫j?;J{99{@ yIENDB`knc105/doc/en/fsetting-en.png0000644000175000017500000017601211436653777014277 0ustar dandanPNG  IHDRE/& pHYs&cu$tEXtDescriptionWindow Class: knutclientVtEXtTitlePreferences ? KNutClientP IDATx}wEw3;d*(J1 A̞ A0"(ww @3ݫg>A%)$Ht˲My:sh%pT*BK #;,3p_4pu wX>ۆ&\G_`&G#=L%RpZyN!5( [>Nɜxg i {JjԻd>@]Pm1EΝ˗/sݎ9uv<hL'!XUQ3ݺn: ,+ VV\-jmbxawOo ! փ]lʶmL%iD`یDիWYfWEC]>)vy-l,WWZ@OvѪUKKJ تe={n߾mS{ܹ1ɳ&_h3%-u3gJlBزbm듀:a@.]lpGܕPF嶨(= ![IdVEC=(Y4APcUуP4bXɃG [FbKKKWok֬=O8A)*..*.>֮}w1YAaIq1;fP ؊;m N@ \?| w젔JA,u"+Gj)O?]-AB۷_|х1~g =,Ȍa&^\IÍB,rju6Wƫqv//*k8nB=d!" .a[@ha\c QB%BXk\J;ĬCQ1B6o-BvdΰS.(/?cǏ?Y&LxiPXTԗ;6ĈX'{T݁PBQ[jM` mtˋ-8[kQ%1Nr(M ݳdɒ.t姟~:ߎ믿/GRR\,iѼ,?7#!䢋/Vw]O,| l!@0o۷N^{]N3BqHӒM>o_:ĝݻ?=y򠁃0d@N`ݺlm :v`l8!䩧,//񉧞z*ȣzrdI;!thotK/͚5k۶%%%Ç5&؄;u#:餓~G2Ӭ6@ 63Y1Qj@/?coc%**PygDlxH `h0s,ܣ-[2nӓ'SJ)/”󮢂qpeZnFt"[7MWPڪeKЩw .ZZTU BlZ)!+=m? y_p+~/xz7=2+~ ~w%OL8"+-Z̘Ϙ> {`!c ~w%S׮]YW_E_|;[zj>}ڄ kŗ\z餉g< ۗ,YO.\hM7͚9P593WǍG?1ݾ|O?T+?Y~^~uqs0`K<_kBԩS?sK]v&Lҋx/_g{)K`M6$qضmbh4uuuuu555[vaV.PH$_$dFh4"x &:+-ΣTaa̱hEh,&b) 1Lh,%Fmf6gEmǢјml;X)8cn<.k%nl-ȶmvUwǶP@*6Gg15")ZAl۷7 kpܹ/qwqX+=s˲fNs;/ŝN?w"̣dX>-?͙~ӧM6%?l313Va\}co5pw rE:m eQf׾ !;vT>'ޫDS+}ْ[ob[Gߔ >^{51n5h@ؼ9z‚?Ꮲݛn9#1j,& B***gԩީc?8n~pBɓ' Ҳ, A܄|tOVVV@AAE @ŃEfȸ3qn38M;!C>c8eSPYaaayy={ !sE`4p5H-(@Z0{H*miy$3 ?H8EyσbG:;B(b)pN=("BB vR!?:hM]GVHUي*!  uc B eYR D(%%j+^Ps/n g֖;IJUP̕mA;, ٽkW#<ҡ}{r CX\$Ñ4~gyv .?+BUɣbny֭/8UT~ǡ=o>ؠ M |puap]8== 饗,XpΝ;cƌG\” Ǣ#* x&|N` ٣#3BjjsVӂqG:QE+C+S1R y[6o,**Rz8/I-'g;w^aa!eKJRVk-mhǂ5Тeee}4t׀!W_sC^zo&MCx&:kEoϻ{ƍ寏N0O'ֿċr9xQ^^.n)=bN7//Q_X/XXR\l2:AҦ0Ԧ8NJdP ¯y% edkBQO@ jB(;8e+qىPKLDμ^$rMşonENL9ꪼ|Pnnڬ NpG3$qQyyLaW]w^}7\ve¯b1!Sׄ}bQ񪫮: N 1!)(fѣښ@B4mڴizW\1k{RmE#Y,;jV-3J)cmXaP}-ÍbC-)CaWI٧ͿG`ȈF\5qݻv_yn#Y 1N} 7\Mnw6M6kTܹgϞ@/gʏsիvڷI:lQoE.8> s]~MzZR8m{|uuu,8 776e/.._+;[vFR G30wȟeMm.|DHGӝp8Djkkkjk9TWZ\=Qn>0kܟtGϱcp$Dz΅|DcXŢQV4e+?<Ì}l>9m36VPͶmܶch(fv<jLNܶݿx<3|w,Ώv qrp:,cOTm-7!qQm;xMM͘1cjj:0gm*f ۶"=iӦ]s~aYXPxcQ}WH,(\έ, D%F8ΖiӦ{˥^F5);v8-zd۶@t[jѣ,YDg9XB,;S[QFHdgۼܼp8L4@D^5|x(3cΜ9 zy5Oyz]}5 (><={vkj0DUaÆeB^}3 1"z;5==W^\s-e]6ǖ,YB٫wMPBa8`3FTUUB$d:B_}x79ʗ2g}Aǵ뀐-[wzo֭AZvfdfΚub{p #oĜ~.t-v߰Q"eDeC)'B|/ 2WD*Dfqd8jYH\#vw8*d:h /!K&Lm^t6 rrs3l|_EHz(4e`ZZǍHdegܼh$BPdl۶xN'H8,Blp˹ypXtK-: IDATy~,j)=*mͷ*..z^9t虃*(([Ɣ E.}+8V6W ;w.`6]izzz(#c….<ߩ999$pݢŋ?W׮G׮-g] E8qOHy nD>+ŽRql@q5ާrw6G&rg$xXNE9ۣ04 Ĝ afІ)îj6^qvUۻ|~9gSL]i6Jg?Yrvԙ?'tOѣA IR\6ܷyeԜx@x$6+`6*րʔ0)ˉx)q"V)V'gs|@tЫ /_}I2Wfj,27,3Cܓ5V#+12+D .ľOT)FP]]+, SŢGlLg3rE"u:@qҴ={Y?6mۄB!BP ו#gzĢѴ`PҦM(bS$ +NI8$MZD"a-oR젌`ɑ:bR#u֚ape**V)GF @^~Cy*i+}O>}vȽN**v~7wNvNN]]]zZz= a؈jBF_4=pQ1Qck1K+'*I/Pғu$uM#\{M0ծWk4[@A8̌G31y!L$ ײ1X[E覇 >gɗIբ.I^@puc!/s0t1VMOOr !uuuhӄXĉ;P(+;(jk3FT99&MlP_$+]a&B"[Iq`s@n8w9hb 0̵gmaFFpJ֏ߕ)"c*i|[]w)LGLBu6 9D]w;s»a%E>McJT4m$ ~(<%Jb]cNix 5{ !@{4=JOOcж#H,h,3T4b{vBP^^>m>+BX=ʄlb ^\XuJv ÇH\`OBP(mF#W3~CPXR uu>XQZ2:|)Ew]|j!ɔڕBDWxVI anq6~?b/odUI1tn~tC/jkQ W8fBDŌ;RLq2O_K#+F`Tbu@ 8"@]p䡡ZJi"l% ~i} K}J˔$ ibȖJ"'`T&D?܃K;('}:Bd|QD"a?9/"!957(oI@VM'&H? 2!p@ң(م0BĄ[.`0O,`wki! 9oB8q"}SxQp# @%q79)2tDŽ8 ^p}CUS&O"&;4݄+COw(utO*>i۶hK7LݝzRv7Lbk3xg>Hy; "|t eR[4XgF0-7Kd(yg*) )  qpz=E}tG @zzH ,@foqx<~^By+ѭv>^(mz}zAMcFj](#q*MHIO9g g)Jυg[ w(#!Gdž˕nx+8 x!)O re :lyj`?$ཻ8_El8^w 3 ؙ1%TC@5oh<򦇲M^N% #&O&MaoWzNN\V @&zr+JP%jL' KV4e Оں7_c;!2 +ER>"Rl> YA}!`0~?av&K |BA5dQ/_e0|E%JEQF<",֤%X.Tф6hS;:VldKx( p;8M} 29P '< 3IEQY16I>+g  ="TUdfe\P&6^* A6( qM`a  7,La;E +ƓmI:A@AF䩑t|=`V&jlO5iruKԠ6pbN\ u (cܑ9q5uqTL(?xZID]tؓ5(dg)U)}a4aulBaӯb! E1n]^0J^z5TXb\\ig\Mkʓ8j0&TKb_c_[EbP푏YN>6Kj<$:s*oI%uQf$C-$Z>& lbw|rAeqE @Uh ;Se I8'c㵄D^](1q'ٛB4(SL7i4@b-֘%JҦnj)bYmܥQVՆ/)Xqʲ"3Zók %(DBL槊~>ُCINgqkD!oaFqx`쪌 7!Bz(OG2lHJwoYtWUw:`* a,aM~a5 >9,Y;pEh NFF@nΗm+J%~!(`O[#Ktch=ldDᾸVbm&O~FdG&@NǏtM d7! 6]92\Ӕzp_p)腒FjP/P!\2u)zUG^08W$UD+!;OWP_zE<4tAV%>ל1% $ap)4$`26~0 ɢN\hD1nYo.G)]g0T0 .AB2r،8fpc\Qwb٪z8 LBlcjxqgN36m<PiH0C%X)k}Һ/5όxW6h%J7}THŌRS]fkbBHZ'ƅ,R1#Q9vJ \YCB[[ztdB5n41LX?iſ(<y[ ,yl{^ Nў#<(lLLx&}Q6dtW؍ևvoYX^g\A8I,e 2)'bC"cCk; DQ$yI`1zފğ 0{EcT:s*z*M$CLό&ALh`3?9/o5(޺I`'A%eixO7 AJ} [F]oaEۊo}?SCW~Kh?ƙVn]Ydob3R҆VQ@jY L^ {4dO#sj46Ħ0vP3!VY/б ϋ) O}:Qג,߈pJE!٩ +61d1r)Vl{x@謐gnzr$ ~&pV[rE !~vL pZWXv:%cBNgK7zӝ3ЗWWF仉y$"Wvyױ$ J6ͽ%$ g*1="2(%9q0rH<*7 (JFAIķהG5p"9ݫx9ɥk'm~0g* n0'td4,V*DLj[J& f̍ꭰlc_6/tчWTߺNSC2o.R }[.{z…ֱ0ؖ u5~4ܒDK\\}*ZH'&riY2onF?/ՀI9ģ$ÓL r"1pǏ'T}Ln)&^LojBtLthjfFl=19}0L ?@nC0g+P$ɛ ^}A?wuyzO+58|Kp|/JD\yS?TʭhKSEO腘!Uw^,W>H3M)S~ Լ&/,Eq <5AO$IӒhQh4ZMnyYB%϶a !A[@0Hڽ:H|O|WÝ![oGġ|?k1$<5{ux$b /2UuILVz-^ʦ`r8i]08lb JE}Q&:%b(AS\T =R)ihRJ@˔A/D4᝗2\?/ (]3V"e7|ap#3.϶S`t p'9)z:-xZLPװEH 8)ԃ:h>>ICOd._xʈ4zL| QB+wDAux.G %\v xE4bX_ywy# sxSp 0z {#1rGFT(-6ۆ!eOMz%^-w諩A&@qߺ֔j4 CqT˽K>3#>Gq7hFK+#[E P:bg@Eƒm@P'(.<&_I8t%=%hpv֨*Zr=($sy<(c9j`+n!HgȽmI* b !0z$Ȓ~$ e`4 V50/(6NY]]]uuu$ٷop+- ŕ/\>\!} 8M15!*I2QO LkUXRd;v|ЖzF5P}=A?΅huE()(a/{N( F@@Ř\ <b%5%iStfo! 'sT"-%O)0cnL! .Ow041S8f7˗-?+;6={1@۶0doyyNCN|SbPI¹Rxh: …WuP 2;R jp`+i֡nx OIOJv.J UEh)L~iHip9+5-aXql=R~oϙR2iӗK9T*DfLE#=y 2 ˊZhGWl88qI#:k\XtքX{TFhAUM=?̬wK,Zyt^y|x% VQKP+|ŽUi;^F_\'FҰސVTN6㵱;82WwJG|&$I Rly?aw0(=MGce葓_'YP&$&NkѨ^HzVНv{ih7Q?4Pm?SJ ( XVYYYvCMϮ7x&}rɄfG'MlMo X]EtN5LN-? .qΥuܕT:.sbDŽ+,)yZ۲Ha.#AIIp4{\^nB;C. jTnbQC/E#z?s'H~>j]R[7Vز,`f'$nہ`"dƍdz jxֹs>'~zϵ(i߮[iV5 ,{bΝ˟ϟ_WWӲe+&Jqt2cP(t{lZJgy'26TTm/ݸ|k$?7{_uMnv!b(.^Y [nnݺ=S8o}+ kbbK{% uĵYաCNb__pX`,ԡ(ugo%%%]z7zʒHbe L~kPJ{}O>/iwt{Q/N9?48Sr4Pv6$x7P<#n4SYO')Y/te_uM! 2&`X@~^^vNNiii[SBFIϲsrsлp B]tI̳l~U#I̡8W}Py{_;g~A %)('q5!$?/.?orQeW&NثWy'?Y3 !l~/%K|J,b{{7Onݺ￟N[oy%̟ʡC! R:mڴ'?~ߜ9x{z,HΟ`"oRlrvkeb{~ ;wȑ#_=[1&pͨ)R[q5Og`qf >t3g2X{+[+U$JR1VT1&\lp+ƻU0_n,B@  ӧy晙P^^^VVVfVVfffiii߾}N,5u<^z%f(ͨQBfdHnnƱ'ݽܬnM_ǃ g#5e  {=C678*##aWXm170`l޲pedd\QD#FBG\ oyLff态Y:ABȮ]z>g+xV'/gW!yVE%??ɺ~uubkƼ6@ԓF\EY! >#VݓХ"INOcM7ZvT]fhNa-[ffeY"cbY!#`׿FٳgUW,ѾQGt,˖.^wݼlӓ/"(߱;\Qk۶m m@0ܹ (@aQ!&{ ȏ qRJiZ0".ƌ;ySmڴ;8 "KΠUVoF([]p 7LwUVb˖'xa0'jjj~7f؃7]L?^5+L>ȃa?fΜF_yewUYBQrmǣ:ω} =kح$ڔC5+p̹1R;9]=  Z%Tl7!WK҉'t.,b%XI9"d) qD'?mAK"$Mp8DJitX&\'W8ᢛZk*HFm8 -s=[ddN|[w>]-SRvvOUTTضݬY .ng>(~|ϞW5jԩS=\%Hbjѕv͞3{ILM7ĝ_f,))s뮿^.ÆѣFO:s|.'Xt)!=L9!i"SU-,χ֫L2:1zvx7bP Bm%?"ɘ(6])--uN8)/i9k.^%r]yq}[Dz++zsۃJj`ij[X˜`&!<ⵕ{jv@'01mA[&P]]}ꩧ̛UZTs::$V`2ͣ%^Z r<]bC9z$7nJX,{rM߿X #?s yg(ǏO?sNij d ?SJ3t 8ܶj#V9`.2ohIRT%JC?tM70x`="?B2.t cMTTήQ-Aq{OD$-A9SM$a/1t%PJfɤ):uto_y ]pMcuu5!q˲8RO`(+:[G_= Ķ{H |u3zC_6(={暫wQZZr0í9Itrƈ}J70U.זVmRRϨ3?#'TF5Rp&@ڭ[qIߦY|5ץg۷oڵ۸qmێ;{(:7]<{ⅷ?Ylsԡ Bh4:2?c1Oßìswd|k}@I"FK~md<ر#{=ܸsgyfeev@Sqa҂H ,Jח.Qb ~ y AHgf: Wi hHb RD m8m۵uuv,6 ϒ?4O{5۹Y #'P9*߹Ǖ-|e@d=>\Гq0IQYVm#‘H۪e`0xw϶U{%Λ].x0"x,e6K·)JQR~ؐ+>.ׅ#1;B)uh]M4髷:k(E):tF^4~șiii*'ЪeӓD&r2x;y[hn;ms(z(E):htY|[Ǝ5kŭg}xI}׭0tذG~u L/1a6niW뭬pg͚9|Ĉ60reRaIO#IV𹭗ʾUCFڷ]ay];7%-xֶd̯Mց@`4YӇ~WVV~w[(EM|}Wm߾}{mm&^xFh,FߦM8qOe EaճޒCOCzIO4̚MR>hзI{-[Zl9v-wߡlPC=ww;vl{˸CXwHQRԤW 2domwKxP(th=܌Ï/>}A>sJz݋L 7qxb+ YfQ(ETxFSEy(ɸP3ۺ,?/|eV?ѣo7oKӦ/[N>}fϞ'B'ya ׭3{ο;v4%߉gyfg{w۶cs>+WVnjw߮]3f'&)(2\x/~yĨOR_y+3Q ܱfo.˿μyخ]`WvVTTVn٢? yﹷyYYO>+_{7o{w6>;ﺫĭQFgff{9uuu7]oܰ!q w}#FXzub9)JQ~aRt/WsXḽ6oWs쬬9ɧʟڲ,lj[?/MBvv]wѿعse^Rq!֭̊[:BVJ!uVn~~e"m1#MR ddd9WvVf={u9,#...}vmYY^c9橧jC>G_I_[lU~' ጌ سg(7Paa֭[۶m [l-((Hlz LQRˠ~a jp8k]>1cs&L@eֻ{{T*OVZj=WU@{DM3k@U\]\Gprpr.NN ḱp.%o0nܸ֭[7aÆ&|Oر㬙3۶maqd15o9M6Qѝ;v.]fH?CۣpK۷3fLXh(Y^F!!!⤉\]]޽n_*ME Ա@T rngkFMb.xɣR^~vRT\޶gM ;~j@@J@ z>p!zDV)8N{Jx{ ׯpӍt@ vT*Dr$3VKX øib[30:# ҙ̇@ Aְa2r,´>I}l#Pj^YA,|l˖J<<j>PCtd;5jE;l'qagg3 Z I@ & FНc”_EB6T*BA`~/E/g~d2Mپ,؍t &l~ 3M5Z 5LQK$*0 @ l;;}PГǏMz`$?gIO IDAT6ˇIYBOF-Hm @XJjv@ZUjqvr0zr ޣIhap1jqϤR @ $ EV^П-.5Ci l7 8JOLa*Td2R!j7 |򥵭@  Bd1eY5gHk&N͞9U?w_N#ED BcǾxAAA3T55;#`gH5gg*l :} rNhƾ!0 c(&xaSĦA ,6lbkf $nFU/EoUhq*(thh؉KuBF{vBddM7jC f[5l믟>yRTT/(hÛ|yry-SRYUxgO6M,}k]jhBDNۿoP)F=/خ?$W,.-.UE|7~+]ыa=U傪 >|ΝM65Z9jnܸa̍7uY:_!̙3ft[LL…d׈[}͉vqv&gF9k,-?ܵk{0{֬޽{M3[!}DDĮ]VX˞ǎ[f ?==9_4Sq ]>>׏Oyag}?{m/|?L(6]kn2&gNωJ(˙,6J{`B(vQe˖&$,ꫯYСC,X[J<} #;EЄ&jR*, i۲eE+r gwܩP~۷o.!|Ɖvp0<n 3M2*7K/[6uJzڵݩ'+W? i^_I$=zL2k-;ƌ%M=!@SM׾}B!4fّK.Up";i<<88H1k`4O>5/|>ou2l41vlX2 YqY8l0Dd{UafnafȟY3^B@ ƻB  @ 3+P 9ONNBu5roZ:vbalԟAvNzƇF믳g"L|m|#zB Q0I&ӧȔW@f͘LVӦM޻Ϛ! J vrrM4q}>|]De˖6$۟)-[6@=Ȕ5k܃Θ>=y~ժ6Ҳ$.ļV! 1NVVܹs;uԺuqc]zLGZPǟC6,..LѣG.n]v))o.]2lpZKtt'QQQ͚6;wÇvT5Fg...  ż<pq-Q#I~rMT:Noժ3>v *:(:t!>. ߲eÇݻwV _MyG,f_6dVZѣ: tBT*U.]?Z޼ys.]۶m;?*J"XmG?Ņ`ذa}괫ԟYYlԟ0V^%D"ի`РAenuGK (;o@ǎ,mlݺU =zm6jU;vJLLԩc|\<*&%%QȱLY9~•+۹sGu;88t#Ըq#gggj={<{~=wڸq#^o l޼4kY޽S=K6ŋ̙3]pa޼n%͛53{CRwPə3gfΚ2g3gP͝[V-3b$fVðb9ٹyBww1 Jg6|#U*$&^˞ksԮUN<ŋ&j5aʕdq۷7o^fff<<8qDt|TϒbϘL9sfϙw ;І8`1F:ٞu|<@GGGrfrNfUvsn۵PWF.\Э[[3fL^+5\\\32 {gk[f5lvZ _dɒgt1b5ibWٳVZ6Z9!cCJ"j~Ԝٳ%[ $_bEvf꼼UWwx~{{Tj5L~J"B]\߸qc:y˖^_|iii*˗}M6Ν B(޳;^= z~٣iTʧyl"E0+Vӧt0ķ#F|D*E5 3 ;={4_?߸K 1b+Z5zž{@aóymG3! kO?~ebRRҧyllsC;M\ 59'jHӲ~J$~=Q8r'OlmCs'{#߈@ Ho 2چ f7"(8Ϝ9ug@ ?C >QnݺemsQ@ @ 5Q@ @ 5Q EhAS˕pmo{QX~ůNGNBWaul˟) FBTj4RVImCu9"p1cXݟ |_Z("͚5ܛ%&-FBiҌ ^zElvy6޼y۩6Q/^xMfU HW7qW(k/A6; j806???z޷p6Q))<*3|@T>_PPh޼yt{{{ ϘL&spp nh4>_V-'''www6fppZ2q!qu`EETDDĦI;W\9>2Z![I7nJ{LK*ڵk<^z͘>x&0wcO$b\v=A`da"'Lx^&Q"hefvl?dP-:_spvq V9rce˖gQXr9tIk֬6fZ~U~|B9>!_> ccZ6yqC~䯣O&/L\0Cv+WԙU\a1kܸqaAEP&82K_9~Å,;s4J̀@Xsg޻l'O1o +߲2"'L isǏ<Ͱ5?+φe2aaa4ÝG yN8+cǍ_hALt@Kj7:S 8J2{׬^j {{{>>>LVV9K?|@"54"33*"##mhdEM s hԨ!aTbPYFVQ$++˫]]̀(WQ~t^Ԟ=}Z:X,0hs?Pa(jo$lI!ɨ/4Z͛7 ƵkҪʊӡC\&:vꤝ߾}KΧc<gϓXN5Nݻw@F}q ꖭ]vjjk׮}YYAvN ^3DBLBάbwwU,Qi%6vP( bq<<oo]PݺufoG4Kl?T*-((JOO)))ϟ?Ç%>|_reݺuNsΡCn(;E>^mkv_M~x!7J V_1199991 $e2fYoߦΘ :t11dcfLFR=}dܸ ^pܜܜ꣦_|Y!>YVZ/~ָQ֭|} |ŋ:ϟ'''ݤ(dQ`8`0x<J2 ''':ӪU+//z%xzzT< -lr {c-[l]=9zH_%o߶*m7kA_MD\K'δiS̙ry800tysڵ ~iW}'Lq'$,#(d.͏wrx/>6Iӧbq\D/_~HW*Ut 0 /j15ә:88Yf+ |嗦Z@FXhXn]߯י@|²<ŋϟy&''].]gvl˟QJB @ν lc8SSZK}s>'<o$,ӊV%ӦmqGxx؍7w-ZX\VZH$ lr_ibE1Z1Kp_/Lcپ3p8G~\Ui%yn۷mkZ|70,QfHv͚68}6j˥޸qÂ:wf2~~6mVUh3SGdt*H2A =}F2IOOHOKKb!J` ,h׮j׮]TT 멵zUJۣP'ODڳy&Oo~$l˟bD"HRRR>|댌 QoDdZa<,/H!8db!Vxq8OZ+L&OCk'V*dW$  [ᣨ{DEE/X'f͛7vR: ()es#2}U ~(jժտ#F|3l 2tРA ۷]:8:HFcb3ݸyk ]uq&WO=rsܽwW\RH*Qؖ?cl6d888C IDAT2}5+Y?2 L/^uVXNE1!%3.#_Y|…'N'ӯ^ޮ];6 11|Μ\.wAd֬ }C󝜜ڰr*.;qҤSmu0tƷ4^HԺu[8=,3$$D"=L_Y4D`B!%1BjTsssOH8|OC>'y߂ы@ ~d2tJbXjh)QQ&'//==UVT Z&ٽ{ALǎlHL힜$ AҞ+((zEHS#*kJT*.'+>crU*Anͨ䔗G 9:~|kԫ*gia|ZRy+AmjWKW/-5?W}Uu|f{x϶ 5ztRRľ`H̐Y pbWn6F10 Dl7YXh蹳gsgφ}|ӫWZjQ9Rͥm""1Z˶JBdRT$\@Vq@YL&e~??\+Jfƕ I9SN]dK EJʛ)S&_ΝhDtybLQlʔqqK\P(^7yTj^U?̙E7jhR4##c֬T_DD͠d{cy_-UT*JE7R)ɔJ%HP(*Zlxx@uU`t:q[nYKXbYT2KII t0eԍ7Ç3f=bH1yxxL8_U!4,lbc_HSΌ/Nu!T5QԒqǍUePkJ_}??jM6p+B֬]7\ruBC?HU|8O2LX f BlaHLe4ĶKYIH#0x&.wej޽zܖȹL0vT&#ce,ZhŪly!> ݔsV3eY.e%Z5ˤRIzRV:*uch4vh4#GڻgRg f GťGϞqq5L6UH(BZFGy52e%`:\56긞|R!& W,_ǟ[ iΝ+,,Ο׎)ZilŸsJʕ+֯['ɷ- ̢fvFFFtt._Je!!!L֭ywa ~j)3BMA,W/4d*xwWNځ5 4R `쫧qK7.00r} HwAԩ/8޾sCǎL&]ؐ?1i֝>}Jqhܺwx]q<((hUm۶ o۶{jժ]DSl0d-뇍76<,|ŊIII6ntT*e'jjhڰe`1~g?-6OޟQsp'O\2|BpaÆc8֨Q| [hdpgX1mɾ!eee]]ZttJT6|xJ]<|Ԣ=[l^pAV^6|%KmZEP Q*ؕ! *J0\/7^T*Sjd$wnߞ=gg2Ymڴ=p yzunB+x&˧O7ctytm qU7 TWzʬШ5jF L\ciG\Qzpv?Ԇͤea =U7d:5H%fgdwl;٣}Sޯ%KiQ* 6'A 6lؠH5_?tgϔJ-@;r 4ib  gByy<^ 55Lܽ{7̘9DFN]vU1TCaFĢ**v)&߯߾}īWPI6mtR\gn߹QaNYB|7o%ݸy+}ڲ\gϞ2x,F 4Mqa40SrUoCf mqCy fXSgp&?8& ӨmEjfNGމ҈MWhΦ2/Nǒb֭[mZJ"ʉHTXXXXXX 6 3ޟfذUWoﯾws] v0 Ъe@XhKk`H3-$0fD,bW:Pa~ޟɧ4xN=?_CNoܰ#GS*Y˖-?rtm qU]v͜1={* 3?c#]uV&1_Vwd@PTo0mX{n JXF!۟M=LP_ z2 {nJ Og"F26L26""33~ԩZSjg:oSS<}fC ؕ`_Ǐ+:dNR247'gƍFOcRMҵ+U?o޼6 2T3+r841ިVk.Dq`<:׌;HǴ>?#ݸW``Eth>? ݓԩڠʙcC3lqGy_]##]6bÿa匬4SN1jjӦMzknܸ Ţ-_"9y;wdROLjPM4I(FGGڪEt#..n٥I'hR,mq{ƍ!CΟ7w<oժMۯ_tTM *j~k &f -U===?ѯoJ=m4#V'NUj Ӊ1t.hZF.4P3vu9'+Y"3cHspxL+rVԶor}+c:iI0L)UnvQᎥ3l&3DP(٩)yBB.'ecqX..n~~~,; f䭧C׮[tG5r 1VQ(+CTz77w9A1ߍYΝ;,u6;v$gϞhQl YYttܹsB[􉊊6^!QT3glHrl2}Enߴp~^S DwgT{MŔrOOEA~B!=rL.pȑW6p7w)6YI;r_Q/_ճ%{NMI]kmC%h4ڹsgYL&p0M~*JPPtg-~p\~ۼ}=GI1O^o??i?̙ ڴi((W(<~\PptZw'MAAm25\\b; ڋOve"\&.SX(TfբV%"Qx0 #4 Ê^"X fO:d?+7*%4EBU໹8ڶTG]^W z~tE iψ^h@aKRDM 2P|E&N@mOZ]O!T*ǓJ$6x* 0'M}G;σ<{/dXª j}GWBkA1 dg4aM86Ǥ6 EKь3؄@ȟ!13CJ J݄J3$KBZD ǐM!fFQ_v)+齺u &)Tjn~)چj*ytɒ}b6j49{%K^~06k"f9D" DIOa7n~B}[hQm3Uϟ=0: +Tfp5JI#n+vIj\׮YX7QO^~}F \|̠WmBA^vmQ]qwwwww9p)'QRg2,h׮j׮]TT 멵z(B>y$o o޼LU{Y/M6}YaFnܼٵƮݺݸqZ+We rsܽwW\RN!tq\eUZmğTfv0YEh4JV*LTJFciVi i͙3Wr'_(dw9?0)p9|OJ .!aY;5"=}TRO߾1ֶb<*Ygg)MmFP)eM S(8V0¼Rc%Ji4ZUW8tQnZbuKE-sSϐl߶J6m$ug Q~{k߿\E_ BCϝ=Ͱa⹳gBo߾pU҄bU<%U NOk[Q0*{ނMx\P*JBT*U䏪4jJVTj JTRKZ-GRK,===???&Ff^Hu7*'ƍk׮eee~3lؘ{p'O0xȐe >|òo<2Lʕ+ իqL.+MȜQHU^{} VXMtz|BBX໹بQFm۶iݺo1 GhXؚϛ3oօ~p͛5sqqJ3?*ɱYӦ>ov֯?yd_/{UsavT*3 B*0 Hb8;;NN4d2 #Nq#cXaa=0 ϗ%L-0DDzq6mZm۶%%: I0,vѢE*m9BѣGK9y3,k󖭛l%_>kr11p̘af2~VA8/p FKA( RaAJdQz89ܶs(8ID":Q(Uz0?g7_?I߾{˗tzNkF͛T6jXQ\A@Fyvv^Ҽ9*drٓG*3qo]uB`Ng28xukߞl` c2O?h4>>dbӦM\S;ALjO aup㲲:zTRcXZA<.2>3B#}~}ܿ^FrAAZ]1pj5 <A^kG-V2?~xѢ7n888̟5lpk[T`\IR*0'"ef+rBa^J> 2nN/Ǡ;V쐼Y,Dj5FËSpp0A8%͗:Zoe@:#^WV`R^vq{Yrgead9xqur%ՄP(dTR5U^racAXqoFFcl6['%FkذaI;- =VrtD%Xbs+eI4ёfC?qd2L]h4]mgUC1IzPgW^v꯿R" B^^32rA@nnnJjʕ?xpfϞem1% gڻ\C].?UN<CꟑH̦ K{?w1En@@'@gj!ϰ===Ú|X,X! I=,т=q͏w U&h4 RT*>_.A-,Ĥ!)%TRGg65ztRR)%TJ<#5fayϟ'}{''7@T!OaӾY Ø,s=|[]w'l B"r\D IDATR(OF:b4J"=e1UNt#~ٿϯշ_訨쨨oH (Y) +\vvAAA޽4rI`υ|X, AS* B.+ BRK;^3S\?3#&VY'ڲuïm"e ww(WCgCXaJy. z1EAp}V6oO8uo7{P(q\۟r HFdpݲ7 %WNYb6lܰa:g&Mb^IMmKҜ4hP!mRr;ZrJ.\윗'$ ُbwq\`tL-@ Ved5z(=|eA-So޼6t̬,Wvmq^c4K y@ l 3 #RD"R 6'';_E]I'QTFDDwi/&%{AsSg @ @ lmo)`8;;j>i}J%)H?x3G3k@ވ@`tۿ~b%[J`>N{xx8996x. Ȏ(H|嶄W3ǡ4QssqjP FJ$<[ӧX2W[\.׷ OJh,+c$\FtCKY[{A Jws%P˩lڴmir6莧.gBk]FaޞIds|<0xN1:'eg<$rVEPWrq;q?XZ3>o[ӣmϝ@(Zj'=}tpUli\Rq+)gV ix11 C*0 {k3YԶU5H&a9Ӧ%,[&%%aӦݾ}Vђjʺk>D*@!i-g'V[`8uak Vw1ET.YСCjj̙?0nGmݺbYٳg[lf0[mСaҸm۶fddd N@Tt˾1 a ٲHr|޼= }[|9ίPgΜѣvvv?L̍,h׮k.**z{'nڴq-bo~W&C]SP :;Zh2I-e X,ѳui իgmCno Yc8%k`k`x90g'NgZΪ*gܾhę9XB͛]uvvMj^z{,e VQݿbbglŋ6Yf)Sm&7Z?`h88坘lqk202XiK\]uDΪ#? Ii!gg|!Hnp̫گBvvv ƞ8qMl˗/[Hi?#[C9>t2l bb>v ̤䔗Gi9:~>62d^E222>oN[TyՓ'ʙbF4ĢgHb sg?io0C;Rͥk׮}YYAvr={p8lr&TshQ3$rV}ٔ)S^rEP\z5>>nZr2Ў5jefT1kL*}13OOIyR>y2nJ _&YϐYMrgaak֮?oϼs֮[~*m7kHΗ/_oبj CgO[7\h.^g18N#Ix "HPDrc,I oIQ.1?<:L|lJx.;rOx|f$@T #.]ڐΣ[yGFV.Zh=)pIep|>ۘ}o{lzuzr]mnZ<>~+ └*'B5mlDTJ >H!^6_z5o7n@xx+֭[j;GO)?yj} W $*\LivjU%i+W}قe_@8c#"z~]`-Ǝhm1!1ag'Qѝش\ڑKlZ;&V+a'ۤ/ 3Eig`=3fܺe-B E~I qf``s'8w\Ov *W[uu nZoպֺʼn{0e%l FHB@?wYfwYRJ@"^͉{y!T{_M 7mV54gI:i\^yT*jk4̧HEȗ}_]YqtXyTHƏ;|#*`ggw 'o >Qʇ2HeOIQ|yA9s/zE#lW,_ݻwVVV [ffdnn7*GqOf9rmY3g?qRוB}~Q{hvc+oW5l-NLJ:sMLL8p{ U p\ Y՟力7֭nݺ*7Z?R8~kmX8lvFf&ǷӦO߿X,݈ԬECHsQQ۵q*KdS_e:`cj,>ȤRbgLIu}P2?>SzܲedV\\LP>|< |[z>ѣG%&&r8&vԳ{wΙ={ٲe8G8[+]\>j7n>tH===N }} T&JeRi|G_==L&GMO ?jeeoooOQQ?kddd+V[^M~55jZ}vlFodmllmࠠKhX:E|V(7؛"_BE󊥑ymFU HH"!$iofe@!YqV&\.6Rk:jVC~~I'OYrL5k \e<[jutc'dt_u3p4KOOcǎ1w/ѣ'O&uQrfΚa/W!mʞov~^A׎30lTW! T_C|B*>z>~k}P%zzliTL},2qc z xyQi4]WjyyJvv|\4*N;LL&S|Ci~5Q AiLop䣾!Tg 邍C +L u]IL&399ZlOy1񣓓;vX0/o 5RL&: .XHi9sL.ʯϸ\<~:99E"sBf̈͵)BZAY5>[>ZN$#jy<7[V̙I>ԲeK5NH^!-t:hzJe2:12!m#!Ƴ̒={Tvv6B1niiMMM Y,ÑIp(E(=ɩrq*L:˭:U㙝ݛ7od2Y?gጌ *XA n-ZhP޸GyDc0no߼R8Bdm1x}(ɇ.&wСAkHifnZ*|51T*D__{L&ᤦy5C7.Q{,ndh{H*[xy{2¨~{аk`h4vکəbf+l???022"SN+x*,_\`r>Kfˤҿ_tqdiesh._TXQ;d'WqXw$N0#LY裒~Yz!MO罆졛VݨYii)9Ȇʽ|ͬBlZy)/P nlf"sN~zzߙɤ(ՊJv0DRaE_kyW~caP-\r͂" |Z/OL80bf_f.V E${կB!{51dF/-UJKKW\YZZjbbbbbz*_"uuz4lr3볿;+>K/]t~ٳ-G1diOK~?UQ)]MC$'J_!!D$1!'ȔkA=GumW;8[Rҵ3\볛C67]Ts!XTy}&O= IDAT?ۿX"IF!#!Ƴt?v'OP(nݺHROijl==:ߟ}鍚luP(@e_SxSpM|֩99MQ|:d/*!5E:;r?qiV&(] /M=) +M /páܛ%WQ 5F?SԨ#a3R <!j3UHabBM3]⚛q͚[YN<ٳ,jց'OT9}Ҥ쯲'jz.]r᚛mLıcǎ8QA#EL 8:s]uaw%?~t-6Wl6{23fi/_~eV`ĉ'O((({5??'Nd힞VLJJdE3fXhqbRҙ?t]&Mڲy3[_nԩYwݿs^jZHS~EEGEEG?C6m:FÑxvdWU[5i  8|К?[[[,]ܹ2߈٭[76mdd ff [vitٺw;9:L4Q=+"[yzzz3gz삉fgdfx|[[MJe׹s/^hfjں1#N<innr׬Y+S:5뇡ѤI`֭׮^K.رLׯ 0ÑxvǏw?K n.swlN  *,TL&jne%+RV$*nSc|>؄NOOڥץ]ʿ%wfv99e߫M1={$X,mϞ3fhv++MO%r֭[MLLy9Hc'?ET8WJGÑx{`l߱F]v57Nrnj緽^;g<=++а,\M"VzgeWg&Mt:]>wNNejfhbXVÇ_z򻂕u](,---C1&?Ғdnn~u_5~}͛[:`zYC5+UԨ#Eg̙?bqϞڴi_,9bŋ7Nҥ,kQpҥʅ߿Ϙfg̘ #g;z~i6Ù={NeL&ܽ{u?ϛ?L?~BpPPbD*--el6+99)81sm[mۺmYd_SZ1G߼' snnnUH)^AHvwV[zx<^HȒCկHt2_ۇ/c0C:=RtÆ#F@G͛5۷`5\eW@~Tr8Bnqͬ[[N&9s:u`og;uWX0z0{;!uSաcG6;tHDEG?c~}Q4a5kZ89o,a]UH+lVk@hhׂۡoVVV!!_G z3kOyjNGp0ҴQܙc}jTo w(JGh%K7W_=R | 9DŽ/,,,233\]>/O/^rtw7Flǟ~&}j`hXTxʵlMfo,, aB^5xo^ܜ͕U1 B}IGQuC!47ww77yZZfuNGZEB:8♁AVzBq3X1?@ !t#h4{RBAiL*ff~3MuB!Ԑ4x&gN BuqD>_7@!TwG$eWʪq!PiÇϞ=S5ɉYA!5+[7oGz/ҲR4x!jㆨT G?Bq3a!ejߟk/K+bB_23*_XZB}ecϞ_+yQ߾{߿ 21:*Gbc_|fWXQy;wk>_}= Wnϯ^ Ǐg]tq?[?eTUٽ[ جlDFDdgܽw{ik"#Wqq7…LKƍz飦t]˖/$<,luD)e?y,$$tG3ܺyqege]L1sƢEΜ=wV~ܹfll@5QݬcL6/^lժUxXd_tQG 8pƍ>>>BܽKN+}O`MddAAGq;n8k/q5^tkDu_ڵt^p0R*FEEy{yZYZxyzDm(J:߽unW,-99땮;wP(cnfj5wi6h܂K)VX+=Y|K}ul')ZES Lsrr钒+K r͛7tVVVΕJ$KXliU no߾\ݻwǫty67Wwޑo߾uws%S 9rĊnjMĤI^T]!JEiӶn5f۶˖)-ʆ"#*N+fnf{rݻwn䴧]Ҕ6 ]#ܽ{Iĉ'ٳPThp5Xasf6m/޽;41񃗧H$"by'OP_嗢kbr=5"ÄOuN`ǝ^ W7mXj!zݻv͙3ׯsy!C.]lJW4}ƌԴ&:xpÆ_YYYW&>sνw@ ҵ+Si;(];f]0pРÇر}رU72d}LbYYY}W:5>|Ws|>{ڰaAnoT7ݻw㚛䔽.ܹkrpp9{ A7n׷o?e|@{ekkGNi_<3333q޿L1fϘ1GΊ\.lM0$))qꈟ~jE3gΒyyzҥ,kQpg]kcCF,-->z+ԱC oK:vHNt@@N(-?))rg_ݢzl6{+\.799NJJ"o4-[ٳs׮mڴaXץug̘1s˖jԐ7%%އ~ڟ*k]}|hnP5+Ҥ'M~,!+C"A  'O^vml3gڹc{wf՗yNiU)MMM!SRR_.329r%y>}BҸ\YYff&x89:Xpͭ,- c zWO JL H^<8rٳ^D7n܈X-_Azz*/;rԨ%}1???,,Tnmm}ÇEGG^ii顃\АBB J{StߣǦ޽zk*)]W\\\VV1c&L 0* y|>/,4)^AHK)yf!g;_SjF/--el6+99)8,fϛ7ow;ɳիW1RUQ2,33s,j :tixx+@ =s򥅅O=66\~RU+"/2---ɓ&ݾ}kΝiSR( 9s:u`og;uWӡc ,^dog0dڵ?&Qϟoؿ_nݺU^v۴U{_[VVV9DZ~kNql Zp;*$,^ݻ?]xt]~9$$Fe˗)." ɻACɯk.^^/)?߷_~t[b핗k-%W_}%Eb&a~isxXݐ:rG~}y~6s]tQUus^={ܾ}ԩdgɒ}}OO.]:oߞ`h)0Gp0Qܙc}4_`;x"KK˿/\033QQfxɒȈm۶],YDoDӣ6\J^ڱcf͜ѿ=R8}ƌ5۶m:xι]fP[jmDSwOj`}Ν4tRС;|˵)QKߗtٲVӛ7oFAKn?H$I-[A9O L&-vIs51)FtE2?lZxɜS@k./O33 )8bĈ>?<<,<<,""cmٶf;vd;C,4p ^5R+WuѣG˯RͭZly˯HWPP=&SZ,3,,t"hixx~U4B&JYM(Ge!RV u(o( D|6 P:Q^U/_O.Wj_ FP(3ХP(/B)BPR6 cR Jy@)OT Kr]du(DYȬ"V(AW-.?P((NyUK- g/iy(@!-/+<7QVg++Rv2-i6YFShV&'ONjmijQ䵣|> yWCQV|J|O"RgTrVH=*d3*ViʦOqQ4WhϡRU3?;V1 OA᳤bnlŌBC(~®XJj@} SUTOIu+Yg}I<ʊB!-B5B5B5B5B55ART,k6 h&J86jyҨvOH044R+>2SW^yyyJRT(\J޺ױCooIJ EGPcWG "_/-xwrjrLկW9i$ "XY?WƐ"~=\=RHRNId z-׭[zm%T&)@LEVyB{]׹իVxC-[OD`Scfًqc~mhi@Gi9iZVu GXUϞ (;w]\W9S^mN8dU7K dfcnΫw\C S;mٹ W֭ZUR45۩4kFh4j9F#gi֭Zk۶Ksf~<խ]vmo޼惦DTgS0W{j}]]\{='~ͷ|s3fAJmC3ݫO^۟kZam7HѣOC;Jq ;>}dn=yG/ tuqճ'jFhjqҨYL"Q&U[=t!vRA*ϪrpդEyJ&޹ sYxt hm3*UM߼d<⅋?}\լ733ۻƍ@T@:QO3o9zW;Dh~]4GBBB7l~ybb<==-ZacVvZn]ZNڰ=CFuhCɾéYTe~O CoU_G ".߯$#7)w:=i+ B? N0-RsCA (̓tnq)۷o٩ӧoݾb֯__!ܻwׯxM6i^g-ܳ z>% Lm,YUP iW_ׯ_~ML:uܹy떓ӚH !,Z4{>c$REFw蓐.Xa3geef=}+F*Ç=z_vA|$+inSͅ|~0tmM/,bxjbꕪ>޽{t5;w~ȽFo޲7OzZzFDhu9i3 #mنhT:?WP Y[lY c3436mk?~xxxނ/^X@hhif͚={VjkdR_Y z4w4HE|I񛬼^}爥EKkY6 |3U|ZQxĤ@ 440|?.)4 l++++ϷnM C,!59)I?4=6S2k+ϊb_L B1Ք+ŗm̙ d2Ye#Y<O:kiS&#$b 2d,HLHLs[ښbڍeniax8Ko۫*P1='7Hx '<'-4OJ3l޲emAhXH=z gQj- [s𺃳c3+XJcoĬޮMMzϗcrʠ=֪U+ a6Mr~etM3y]l?} LI1!:~y8z)SC 9y7}%g:?J'lm=/^د_wn/YRVhA$UyLFGiJM)aEE92Ҍ +wD\albBNlql[ k䤤FmNHr@RY M֦yF b*"rGT|"-5>iTg T dX$)Ey wɭ˓[g~Wm|8\ǝ* THxb>ܹs-Zԭ[7ۓtz@f 77O鲊uwsFzFMHx֭[Ϙa BbجԴK峜#(-\||:ryD*bK"U4?6,2`6c5I_())gRVՠJ%zGӘt:NAгϬslQTBQC֌6 n l׶-F355m~}m5oUW]f쏖'Lyr֪U+CCcbb,-,&NDVXv℉Ç +))ysO?89:n6[QkDyk)EEni4)kŊW%%%;8د\˳Яo?:1mڴQQV[kG\IoKYɮ,ӡ!ن fܸqQ>1qիVuСO)ҥ/_1-и w;v7Zz4cfH -]kժ׭᝕UiJ6 `Y0d0A&'%Pe#{ziD"ILLٻO@ T=>}!cc{N# D @@Pr2fUӭP]v乸Z Ŏzѱr7j d2{}Fc8]ݾO"t0mW̆~Gp8VSߒHerAL2[Xn^]]%TgOw,8Ӣ=:?hr8zhjJ4Y9 C?_Pi4u_hT*J3, Aȇ K bm{=fQ PۢzQ෨C/m_G_npaVNU! /,,ܿߞ={5Rm7HaC@\]a5b"H1^nFzզ5gTݻǝPKBhi\P$4_7yj|~y5*]t:7TգT( AR( BI%%Y\K?=0p+30jIJ>fW (}[EURտZUm]*dIeչ@6lX=.XyyBIjFX7s \AO`[a,h2x@08h{-x6"x $&&F$cI)NMHXhimihٳZA-@uf 6e,糙l~̫7~۪7/~8Vhvj7ՓWGcssOrX4M~]0݅!c{I99ca?ów~ $j\ URtϺA,*-.!D*ovkC 2)e֤^<\~O593RʷTmcеߴ4ژ뺖eJ+B:QR4YZ.laQ [s5p;~%qwA)# #\i@1B޲a xr^ȭ8sRMm+jg%wW,.ٶd 7l[ϳS59 m8o!;;۶myB, G?Q ۶kI@ʤ|H$m6=,k>33Ӷmk^@|<Jϲ"X6me]C6]ٿ2i1HNzYU^o?ƶmBHfFFNnn.]ѶMX,&,1t"--QPK\(ʆzE wԾ3p1(V^[0:<J]HqpC+w 5 Œȶ ! E+\C-Ƕ @1ї;ֈWJ ]L%`/r5BjQ&h.,Y1;/#00;c$l0FaRzBѪ܁:lj~׭`6RB1ɤnQb<gY[l^x! Æ oۦmaQсvڹfj ;Wq|[nB֮m;Wݺq|>?m]r;HT7?F~_L鮝Ytf @i,JhJ} ~rxUVU.\8Æg9BNQqqQqq^7mGA4c+x%8M$sۧ|#SJw璉Ya3KqK""Zs 'i8#R""ċw<qVJsyVЩSGزeo4ΔSZjA5sU!XfР9IxD-2NEFOB;QN5U@-b1DP(zcGՑLh:p'e"vVVuDƂkY| a#uEŽzٴq{E-[Y%$a^zoڴ /(l٢E<!~eUSX.,..Tr~A .ĵ+9@R0 EEEE={(.vz `[y,-༝IE>Du˲lJ7lXn /ĎN:r-6mFt0٣WuРSj9xD=>vk֬u{F8 xMǓP0E7`h8tڥ[.6~ܸqAܬYuҵKF_(T׮]t 9֔/:wԥKgwJKߜ|Iݺu߿1WGIm|)-{cX ؘB..d!RGm{-\RRQ(MU'O' ly5Q25#t'EU:$[Z$x(xf 1,uxA<3& fobukq0/Æ3f,^5fܖ-6=$9BQ;vȄlڸ AbayӏhDĵ?׫:jau_p%%%?ob۶ן*0b3WF6#? go̕WΞ3G ˲TXtinu5qEE'|ʪUk9c۶ⱘVZF{M #SL n޽{k׮MT"y(3'a t:zJQ#,Zp 7i^2dȟ\/0Fd'jiPtDczz[lyg@f-[5Xy48Q!ĢV5P..*EyM<g 8BX,#Dd@%lm"5&p%XQs}v -.Xl ,⨇q̥E,dae88N!m !n)u,`>!+uT%ل)ؖ2nd >ˢ(?1@'[46l,lBP1R 1kcPT!@}"dr tƂ^zq^5eʔ¢x0l߮=NeBxD((,]vWQ-Z0`mmƵG(Jࠁnٔ*-[֭k.]sm>qu?Z eZj-_#\8zg%Kai ,EO"R+TkN0pUVq%'(--m„k_6/`3^Rګy]EEEW3ډGGfZJ髯8k&v:J3gΞ3tWqqc\L%8-ܹ=wI'>;fڴiSaa-r饗Q~W̙k1W]D {uQJ8aµO;inWm'uם/4wzԩÇ ǐ ]tM637eyۦ[tغpBȓO>QVV=:h JqԩvMXؼe+ӧϚ5k׮-Z7nܤ'3f& إK'ܑw<(@FվסW!f&+&JAgm}̸nbTĢ_EO%*Q4h=tcKF)(e%baz򄀼m;nqǂYg?  }])((JM|>_Ue;vlo׮= wlo׮=8DQ%M,}7̾v[oUⰌO0n#y, M6vSSRJp/‹/۶reڵkDt"[7MWPڶMЩd)lXeXKU`0dUJ Y`z439O~d]vEW^3_߯_tEO<.Y7Μ2?E_c1N1/E3g<)`!cL<.ŋ<ԍ7`ymݺ_~zxS~ -K{љdBe˖= .qYt# (؜vk_w UV}R]l{-z-7mf`С,rcwĮ!ӦC8p+/)S̘VYs㏿o)K`֟~gFmm;Ţh$ jkjkkkkCPMMM~njj]mm]W[Pp8_)D"%'e8Rن1G#D"Ѩ`k0D1E"H$._$k3D#X,DX4D&Fc8cn<.k%ͷx<cqb˪۶MBD$>戄h1ϯ< `8wW^yO>q;H4$g-bBv|۶=/O/]",dX>_7|g̘tl313Va\}շzO=5i /w}ǩ, T; w s*W}OѕDaG񵵵v<)٫@4eذn`6gth ``7N)==}=[{홙Lv'Ǎ7xcmޖ9|0ؾ} L?=ɓoJǏ{0ipB5S.mO|Sb@s2`SҲ, F܄|tO@AAI @Ƀ^g͚z[zz {tםwefdqm^L-R%~I6|6du=.j!9(.JL91nXFґzx~9Ǜp F+j%;$E$\R)mB G9DA TRS:%ܫ^$N˼TfJqRʂ%C۶Nx (>.mbYqnզͷ̜m/i/qǝEEE81w/i/y]?t PL-Hf)2~'x |Wؔ8{uE#DswQuځ3'ɉF#pZZ g|%͟fǥh4H DQn wd^~>S{7}HQqΝZ' #Gs:q-(S VZ@ 4w@6m)_Q^xY#;v[~c=:ypLc~ߍ1JquýٰG??;n'1br+[/ʦ顲²"^6wU xg81,d7Rqr"QAPn#t~}!}Re agR!P;S{`z~\"ΑR}Eqs3FθpX|PVܮkYfJeZs* ܋[p lUB,$so`8eaE}>:vm7`0-F">..HKqcS>̳ /Xpwy嗋*ET>_,9,ڹ󥗦Ǝmܳϝ=b&433`ՅYj>}  4xܹ3gμz,!LZ QQad3 lWQ 5RSS+҉Z4YW&ZVZy!Zޱ}7|[TT-**ֶ?"yy+M*QJY];wt8XX#۴پmۼy1 9`@\sW_~{3A X+xcǎn}SF_x!iCFŊd[ט9#BtJ S`[9!,D ۷?&W_6͟qc8^bȑgEaVƱXLQ"jғBHnn^N(b! j7 IDAT]­DV+R l@ 5ާrpt6L:I~)T72r|Ga04 Ĝ afІ)þXy(^Uln3)&g.3ȤX ?1|L:X/+ϟ1qGϘkXL?߲}9rn79 x/Ɏ,1JٍgL#A8ʒOXCO x | bF}p4$[{/~? ,\`…f3u y0db2ӂHHvv>xy"*iii aeƼ;(^%Өe2 Fde[uE3e"my+ns?|W7 ̌7- DѴ@ߒg}ݻhߡC0`ٻv!Cuҕ?'tzG .mlw xlsG$9g)xلwX[*S*Z''iZJkUpr@1 dIvSK#}/@[ӎ) !?0~}>?3{jDueMc b}J(K.ı N;GP]]+, Sɢu+٘fZum,ym(M[YY=wh  !@I CeC  spL1Ѩ?MҤ]{ @8\'eY12@,y(T{c\{׮]Ô -}# 7?"\w>'FWFxvȽs {onl@ZSN'trAAA4Ŧ!D[ ][D~4v-z[z4ʍNr:T;@BSO9= n7$K{:ZNkkP*4iBOH##"f7Ti){ejI PU:Cx:Ηɲr;񒬍V<^Ҝrts Q 7jVqyk!9##ßVO0hKqkd̬z;+++-WH(BDXvm啜c:Bz1"jj4îٟHg / rnzzzfVv<}>jjMVsB:Ux nE>#\sM0ٮWl5  fƣ\!]U1kُ,ɵIMcJ*6 < ~(\%Jb^cNi 5{ !@{4 ܼ\ cp8D(  ͣh`0 汈jk#3BX=ʄFWHxr+c)!- "s= `NvNNN.bP( _5S{]`B5c-Ji52`TK_'>O6莸"@ !$RQ|=+y-b-_ mj=)Т*bPupv]ɵ(uA GIф#H_3k"jp׌;rRL^n"3!ev_K"+:F`N: c@]塡ZJi"l% ~i= K2%aBTR!?2!.A&)j"-a~sQ6EBDsTkNo[ %P ߒv:[4#fx@(oB=#βд@$a@9Fؔ?p [3 m9 [Gu(w\ȅqHQJ83`$(D A= |/6\,x<>,v}E7e䅱xhS^] 'E v~E<5i" !x.?sWQ=1άW!cavaRX;3D3yh7@VP) ܩ#aDY@ж) 家ՠ^S).dc5P^JT76oI*D0z wF SR[i,=|'W0#ЪW* M"V1E*ZxM=c s4_L9Zv~RW1Gl^8L(E}(xIJ~`c[AbBSEzN|؆Z9#.yHKGHh%h+ЎOPC58vBq *yE#<IEQYETs/BCCOE%A#1Y: xH*#Π/iu .p8)͈sG㌢|}'ly&H-r%l4MKdn!M3_iTCN75<Aw݄,my|t +&MznsgpL{ CᦼDq1'1f 7D0]0v#5NJBSbAÖ +vW7z]# /~/$ӕ\MyJRԒͱ@rSېlDࡃTrIJoXRꕩY$f/Qk N$(7"AlTCIJsW=ڑ<yo Y-q-]H]hZXH7[ fxw4IȁCհ(lz:xfFoa~UV/%9aD·0xt6:K(u%!ׂDl@'8d_~{"l6bv\`(O2zJFC;7&#%.3HG_8iL7V:DlH$|vy |B(*$/ #[V: C'N霊J 3#)Ih4yt Sߊ7uto$͕ 24RC|wD Zjh-7Ͱm%މFH!)D 8Y퐻#E&664RJhg bSWp!{@TaL!6Gx+ 1<^HUf i-b5tl$"i ȮXG"jyZ=Ey{X#N6$5a%ML0/Y b c&/79pN r-#M_=\x/ }q}C?!jKq\>7į T:0bI*[-!_f ȱ(R C<(J2<4 + ]~}@rF2%3zFb\LIڤ!D:7ڭ[h:utN S+fq WfDʮ0:EM6uAUk#7(S8̖?̛y~QX(6B@M;"uS1*oi,OQ#dꯢG(-zj˱F/Ĥ΀Mw2`I}UܺAYnJH@H-Q9nb!Ro )R!@I䖼GD"Fcnr#̃ǜ*M.KP5 o9n0f {j٢툟rB@UobFvUٯ۷7q#֡Ϝ]x|ۍ:{<BpLarI$G&bk HeS09۴.Pa6[ȅ>lHBEk(#@x/%L)dI4V S~M9P)%='^qY^h@5ǸEw!x}dO0k"̴Jq mDǰ^^e;3P&X0S3o"{(Q0uT_ *5 Vu.+/w1( ,. *SZO덛4L~'gJ!\.p 8J[A78' jdwZR\ |"B 31FᑕY \Os Yi(U9/ja>hϟQ4'#Ѻj;   şNs&\Ow3Pn\! ڡ 39p "JPG)?5D3UpW Y ecyY1V 6htp!Z]J,JGnG"0J|P1&jGBmeX#htMIwȴ=CHՅ1}HDIDnb̘%Cma`g9q~OlXPmMeFP؉wYiݒe4^:vjNR |(5FxC筃Rh6Ng9d9R X:A x%:ԭ)IEY.sU(z9Zo\%麆hAMKn.[Ovs^JP&mr)Y=]XYv\\$@]ӉbQE/E#z?>鱆H~>j]G@UUoUQs j[˷xun 8V]& Ec{L H5 H.?=({eWlu H`Ϟ==fggio]oz8tr C)Sa\R:t IDATֵin(UCP{1&_+Q\ĕ4ԊݰQeG+IT/xR 7C qb P"/Q䴍sxWϞ|A]]z9wr,_q9bsSe嘘ZvY>o{"}wH+Xm2g5"Wm[ @ }&ovG9lNH!i#2yzSO=7NiDdlB60Ĉ$U&Qh OӂaihT;Iwj4 &%eH%aCUh.)dH&eMFtbs/#z)3/˔ (`G814hPQQю; ;U˶fT޸}w YVqnFfz࠴ޔ?O3 $Ƴ˾G}[Vغgo֭}.[z~#M0 gL 0o=bYVAA,BK-_'--ԩ PZ_`!3--УGǟx3k֬7|tWqqW\1aµH;Wm+WmU\WbC=7$RMV5FLHJiD9 Gf\- T% M7ꈳp(tړd^2_uM! 2*,,l۶g2 WhNfZK}t:f\w ]J?^Ú, u=[+v:ng4kyo<| j͢"xlǍwر}u !}ͷ~am?ߙE?6mt߽1,/7.{;|g޽֫ׯd޼.='|mk| ư|W~X npp~coڴ{evxy/dW5 Ǟ*7mEQM=lJ#St}lBs"-p V*Wʙ#nI4bxObM8͍wKСRH?@.b}V6y=z™w?4j(N}3IRBdHNNz{ܜ~u,铝ݻsIa2΁/$++g̘}%(nݻGok|͙Æ; ?{_QQQEE[o&ݘ>n8x74'Dre222  wlgk>ډFFҁz($"{=?"m蟗d]:wYKN*!ABCHX twOC&:8y2? 5h=)---';[)l3tp 'IA~׿S'j&OVGwRR/n]%>p#K[^*n ,ztT|/1g#uS (((p[=O>1#;Ы0=Owځ.x[oID.M,,b>] Ӗn+ߺucc~kB b4f̘^{JŤoSOzx<~I'6%ׯ~G_U]]ͶZnc/x$[Z-Z(---///...//w):f8$!Հ= wuڋ^jy lC@[0J/L`҆,(+΀z Yc6M >1/]39Vѻ[dzKz֛xY1jquoo fNj>kV8 /6]RN1 bfj32N82tJ؜S%ZrצY*tQ^+ UF ;us5P] Uս޼߭}9A~H-6ZN.j%顺h(HO-| Of5_#S:qĤ2dfe=Խ{bQF}݌窱coÂ@ߒqƳZ&8mڋs@nt㋼dٲFA78|߾sft_z Fu0&=:1xf㙜URp\HɈzklyCg [DrCW%q`LCLxggȐkbvVvXavWo_?85 %^=n?9ʳN;-а v׬oo7ˠG,QZFG񶛮Piׅ[g@ee+'t[%j|tԮ ͱd|%&tԨQFJ9G!kBzŦR&m 5}иG3I*6- োtmKϦѸt=[X;U .o.#|];Q'wkU‘h`wfԭ73fbࡅ':!=0E(QIc ]2`^V⭭Fz*3A}`^J$!TQz;wSO|X8-I|#4k,>/o_.|WؾC_"Dʰmo_)]>Q2'"INO,$$lpljKDgy6sz،gTᨗ*):J)#7>N|rMM]e7-.زh aSׯgD_sW6_uTVmmmAA Bh$RW*@aUٿ_=;T?Ç$d E,=Ua< hA~s޲go4>[|(ΫǬ/7;D T߯-츼=?nͧBg"%[S1ϧ95Z$6-DL2?wusVviv36?$iYf&o[T`QZwu(_a߿]bG$Ag4eJّAe0*~RrIVLaR"-۟1;EC-Z4s~(LC<9u;kwR|_zvP:9*۳ǵK} }9/ u`> {谒q0IQ?=õZqkשzƛÛ5۵w}1oMgvdghMO+,ddA[CR'E)JQ`Ȑ!wt;Ԥߧn֣K,;w6~>_4݆ښH1Vl3rhϴR(E|csH=573ë~VE9ZS]H}1e~cRґ<(ǣץgZt[P/غE2c{yJϷSσ(E)J/#;tuy *-z .lᵅ zU dS(E)J/g"ڲO=v[C[~Գ-[$i(E)Jё@MzY pg^ǞVO}-E)JQ~iԤo<SùD@R(EJ Dհ/:v vC!MR(E|>P)JQRt$P#~a;4σ$(E)JQ5џ?;:(e(E):(TJ!E)JQjG~7uszh=(ELj~c#0wVM.֎zk}ts'8- J^ЪtzR2)LL8ŀc2hk;a!(E)Jё@Nh?T";E(ʷTPҙ1Np3lє¶g޷bG-}!Ï۱Z(E)J@VkRul-F)[]?hκ_ɚkO-7R:MёOo&cfן–?[cՕ<oLQR#g|DZS(FtϹ^s̯{[9 1_}rM,*q kF@4v91K7;-E)JQ*}Uc toާ]Y=rM88/?V0Ií-&.[h᷊&J)WG$ISpM:?kN[,NW]5'v XLԞXܴ_ڼ?7DY~/9R Rq:PYǍ5eYJi5mۙݺvm%}a{QfffڦaGzmo-M+?~Rh2z'%KnER>Q߮muvu5:  n'P[j9AtuU<뉵c^q׻#Q '7O>ipk3L5k.YGp5:CuuuC㎫۶}xְYјFF"1;OvYpw>shT)W5_ӧ:dĈ3_~ya#F9|ʫq駞zFXa<8SN9~?5믟}):D"i >~H$)SX,㏝~CBJO+y{9'8+Xyh޼y^zɉ'rv?Vu,N:iYe>wu뭫ƎM}'| G|'=;cXxo{=/vٳgg<ȔNW^5{삂BgyfOٞRzϽasdR'J:mk[*>?d׀a -bb24l\gqY'D"U;vЛg2YiNG)SL2ޯo_ BcKd2eeeyxxifddxxCJp(ʕo߱mV>_0mڔ| f#Fn0lE=&>Λ7ҥڶiS|[4۷o^D"1IַEQ۷qAK,gqNNaadR1c뇏 3p077 )F :eJ֭[t@X#F|_G`@'yV֎lmQet#f͚qÆsD~-o+wŹAqQY!:^^^uZݔ*Wq˽mРɴ!J6uJLL 畫l6jcbbeM~)JBVsrr ?z IDAT?_,u|01@ vYle233d2Y?3+b_LRݺ}+i۷bccsss?V!E hjքo@Xz  'MtFkJW|xOl Zs8#\\@&rbD D'l=q/ " pnn6 6a3>L[F4E uD:^UuS Y6"w/C {ff[dDE @ Pn1߁{RikcħA8kZjL&Nc6_âzQ`ćō0f }#&FfڽY3ma04tU$A}bgi D`S., vd%+K+@(6v,lP"O E&Mq3 GGE:8Fg`A?@hP!\-<[gRD nn8+KTiu\5-H$>`<3?qan3@ J8ax\ЪUC!֥&١S&M+ ijT2AHTHl=3*Ap|)5 aĕJZ*QR؃ DU *Jzdg/@ժT*@Y Rg" 3WÁ ^wh@T B]5B>o@}PBW  ^ʍg()q|/vھ}Yftk֬ҵKPPо}{Ia.x-VZQ:fK,h4T!;w ֭ە+WwkΝuv޽k׮:tXpV[PHRRI:uخ? xAٳ=zu!$$dݔ٭ZڿϞ=Znm -ӪU k ٳǨF7e ATA ,~!ų[ns 8u,XA!խsv$`_wy?<^n}[n}OjjZik!ܿqcǎ=zݻw6mg3O:5v̘ٳqq]_f ATE,nD3cw?Y`Xph hgA x8,vzFfVV뼹sIcGOƏO<1m g)S"9szԩbX"L>̙3ԡ\.gJr#tF! SN=})q[efff,,s8ʩLSl 0`ay~}޽{W^% o~9Wݻ%ݔZNNNT9&B7j|hvFy"xvR0Q yץRFDo7ѣO?x6Q߾MzEq֏^tAA},YVc_Κ5x}RSrssW.]**--meZ 6۪֭Ur\._rehhhٜ]f<[.ϖ^{PVl6dPz..۷8z_%%k"5kߺ3ㅩ1Ehhh#rU5fV;# t̆3;k3l0E}]LF,":uk^9=zOÑ#Go?rF E :ujǎ֯eoַQ;th?{Ώ9rgAՕΝ;ˁ}]6m(e :믇P3Ǝ+q.ƌS6g}}}YDG.0l޼5tqp d۷owmzٷ_ߦMZΔZcƌ zկ_֭?gZ팰;RuŰ!+ ܴQr/_zyyթ[",kٲelllnni:=GL3S]`/CBيU\l|||z,0~?E@ lN{UNJRW$L&\Z:uЪe f3.ݾ:eR@ eNL$:iՠ 㩉 YY]npPP%[@ `32S 6u*)?wouvZ5@ Cgd2ǍX͛fTx 0ݻݻw6 @ J՞ߨj7n;^1yQt{Ѯv jެi)8F BפiSVT;o_j̙`ժЯ_3 :t} 2 &@X7Z6= f@E.E"qy .>}ƅnP 3gΚ?AŋZ6Ycڴ\~}[!*Μ9SdU;4 Q-\'''2ݩѫ/:z}y΂X,ִӧMnF 3 ={P(\Nk֬㢣ڴi+O(׫TjJE{ P*V^ƳjIVѣ-[pJJULLL3JQmʀZ (JlFɜhKz'OãiӦR8~xMb*U޽KBE 66666u͛5'ˋHT*mٲ & w;u֭SO?~yf1/_T*PH:$Q* JM[7LYe[\3Zٵk>Q*deX,%eݻHx0$33s x5jwiڴi֭B(r'/1/b IMM}𡯯+jCBBG5%6Bq33;vd2^=yS@<\Qt%xьf('o\hQc6oٚT,(Yr"O 3:Z`IJLj߾=M߼yaFT7jd2Pfq4nL7nƍ 6 :|||Ο?Ofm67nDؗ~~~"&'%w`2wL}lڤ  ֩"4i4ka](薑SJiӬo )u PWTr1 qLk4%!c:(lu[l}Ji?it:F\fO#}}}tzLLL{]C7ozz,yd5Q([FqBGH:!*2ܑټekc+JG͚7V(.w}R4…A%* Y$K.LJ6o<::=%é[^rR2)ߠ~Ttԕ+W_a9}7o=xn'ϟuxf}?~pyKII.OիW7XHJ=&L2X]qn`禭FƎeg=%j~RľW k ۷tbkC+^~ݡCGEnF]_!lܸqWV%~;p1NTTTz}tT9TbZ 3D.^㸫+5@T34/<*mbp؜/X3DU˫@ * x<ދPR*mmQY1/,UKyr 3a޿/H\E :. K/y]\ лw|& gFhZ^jqh4@=d9?Dr]i4իW<9UK+ m43T8:I@Qb('4M(tdDnY  c<3Af~Kݥqh]#/z@ 0.pavxF1j4ZRLRTTJb1TVۺuk%\ypuK'Җ߶@ 2VF gFTj4NGNOOOyyyyyyjՊgfsәB& X\X,XS#VWG ԛJBeF8Ϟ=cXm۶+R)  0d2+c'BA<#iU*N#!OOOdP(sΝ{yxxhׯ{xxԮ]f#O Nj]"`lYQ}5RT}Z-ɹ:N*^z3::d&$$wծ]޾}kԨ͛'I"/i8WWD>} T'G̲ bAt:%B2L>O~qdD"QF 6&Y,P( KpwwMLLyyUҲD srrs=ju::.斒,*Oꟑt:6- qdzёd~=-[&&&X02cosڶm{j"999͝N֨2'υB![! op=4:tذamm[t⒊j)RW>}S #>Y?k̾NVgJc_p3*QZ D"![>yB?y& (^ ݠ:5ިT*qW&777???99 ߫j\%h-Nff&ͮ{ƍ7֯_L-[;vL={6+Q,_<oC(95f{tx֭,XPduFr@HHԩSY,˗_x 2x/,'Nի'A`8٬iSʘI'}zz۷ӧo(NٳF,2pjthX*kbXDzWl__f*7WM>MIU*lm^K2Zh-QD2U{Qe|,P]]X m+N=V\xbbUzA3{ΫׯΨ0`` IDAT˒q={v2FDDdgrk+5fS-[V\kHkr!ݺnE}>;;""DN:ݣ{;i#դIc:qӦ={{߾}**-=}ŊFm3ڼdZ²(Uph4cOf[ͷ |FwqTxxÆF '̘>= _6,^f1c;u4gܠe5J{Z,0{Μk"Gݼy cF8I/R*5Q\ﳰ4mҴUN{WXWϞ'N,i__'&&lҼ̾rJppoӺѢ6%-((-4U87sӖN&w|.X/OO *š4r4rȨV|$5Ƶ66uńbkkzwN}^ƼOWnUaC'NxY鑿$'&a\eV@ N R+iq}&p]V%.'2/FWp8%HBT*5Y*Z[_ۑp|G{G#gXzz12zvʬZP@+Rm۶-Fj3g̷i9g:NiZ2T*VK3|q,Zh}C7@|z0Lb2%bJUhW s8 M@ 2ap8% amfu+!DU*[Q  a(7E4 Z @ l'?IdRZ@ .cW&͵QJLV?P[nEQ: 7n!U&Iӭ2#Ԏ0q~Xq)Ju˖9sfh4T}E`8lHѼye -7ڵ+))al:me@ >Iz}NNIG1Z-J?.:hehG,=#SSS{ppgk(qa4pxL&KeU UfgJ׫*V 1zNVz}y]7  j%->2-\{BqVW e=vPrƍ--a-yFʖ]AlB]^߯*ؐPb>όegV?=#9\Ν;5amFWߛgG>Yuu޽%fzΈ1mvptUvk~۷p!((hEo}z*ɼ5^-)g˖G߿|@yKzz_uwnjy]%Lco8pѣY[QȨ{ܺu˔SuVBq~a͜Ly?'N5jޜ9YYǎ3jԨ댜M Wyowmg$L5AuѼknLY&-5gϝKNI րNŋ/^x]pm˖-[h"/ +/!8lvzf\:{lRxSLsvvxƎtѼ/]5gm[nfcn225}tLp|=ŋEv\\~S'8~ؚի`ȑ|P:m3Kh'g z4MLXb׮];o'OԱ 4MN cFx/6<T B2aq/RE˖-WZϏ\pa>}TJeTTy +2UNVV+pwrw77JQr]d3iH(/233)6..dհ 9YL0mT3W!& 4cErjjSC5o $NNؼyӡPffGdڣFjAy/,]49%e׮"($$d*@PT'&&֮U61Q*FZ 7o.YN Jwa#m۴jPl٬ٳ'οܥKimf5ko_#JG*U]e0ܷA?KG0<|QSN qa>`Р&MZt*'UCvJeR\P hh͛xJ2iD'Sn!!'L }'L5$pc9 870I zzzih 1ϟ'$ԫ[ֆ _voݲJQ &Mt:ׯ;Jmc:fsT*^/rd؜/yyymr# r@Tk;Vnݺ@[@ ЊWFt:aN4ވ@T8nn}ӷ!|JDUFőP`ʷY hIjafܺug >a\/'' ǧAS<}fZavQ^tὃԩSM7EUϢe2CϓB8^ah tzy6 @ Krnnn,Ν;6 ppre Ts3Ndr}0F ,K"*[Sep9>y| cVʼ qd"f&#9\._aXnnE @ >70rKAh4VaA999Zb @@f!'}haÆ9~AnRӳN:l`y+ #(8zׯ!SvV51 I|~ݺu;a,+:*J׮U^zy׮]{와@(!Du:}222+,H1^y{Lt:%xh$`V^D y@|RV[L&N(q^d-3WLwl+=|ȼ(`dJ%P3x"l6&MA IBQFM\S+uZ2_q7w\-e@ SαG:s#XN93bX,5HCtjA*ڄI%7,:2z>''G*js/F#Jsrr׌(tL&Sߕ/v ϘL&a ]$8Q8P$>k!ݺu 5jEU 0v{ zJj =QKdI/@өUjϬ}3hRtކewbr1L^RdF+[H3wnM`nn5wkf۽Ԅ5AjZTzøeagMI=xpmϝ \|)ܲekFzC维w[nkטL&9hyƾ`Yr?Ǐ9jYYǎ5rԺuȣwyݿ_6qFR`Ѣ͛6?4#2uN:uߓkբJ޺u"Oq#S5RXۺu{<#G{}J-iyF2Q"r$+3k۶<2:jn޸aA3'HvSJ`Xzdb73fZka{eˆQ^֮]ۥNq6Wo}4t=e V#BoM˗+#Gu9SSSCӦMdgȐ/b =wvҤIbX"L<칳G ks8=BU*w 'NGLՑi\F=ݳe˖VQ*QQ.۷J?w^bLa*?--}@:˗/ߵ;vɓ&tɔ铧6m|Ev%deei777S5RXʢpwߒg*3^/呻[ff&%J'HvSJ`Xzdʅ"ei3kI{7 gVxfIV^O0 s_a Y7mwy98Mx}^^h4OF4c-gKDߏ>$$/(SRjԨb`5k8tpÆ ||h4ﳳw]ۼ~אkr\.XB۷߳gO[֯={4/\|ERR"qqqs%{Nz3BZblVJJn_}vu֗X![HuggrڈJ^4Ui̳k3eg׮]׭[QS:E0u˃zdʅ"888yh 3XhQ3bhba&N=&_y|jnn/\Vbcccbb޽K{nZflN>_nݺkא>}|h"GI}۷T* '+m_۶ llС|AAA $;͜9388xM /0#quw;v\fͨG>A7iҘ%ѐx72|A_2e܊-Y,xm͛ |x^^^RRׯE"Q&Mx<]Ynwjׯ[`ksJMͭ' Ajת+|]Љ0 xO~ZVM|^ T*6pssDNNN$- wϗdIIId0kѢH$.?򔿛ho't|@éO5iӼhL DŔe~'O螝g Cx<^ڵsssɥ tt:f'$$`֢E 3aU\EGGݾsۼ@r*Ǽ mެyeڟ20.fu:ؙ^xiii"GXjQ(@|0L `1kHbJe^|a(7 h3Aр h{OB `0pg2</''ѱqh _mCv*RFUN˗/t/ Wb=?VXUo FZ, f$lt[@ >=x0&i?T!>1oD!B7@ @ UQgr6e"D5dtx&:gdմPt:NQCV0A ]xb `KȤ#G޻wo/c&M}JvD8Iy<@ vBJ999z<|_LDHݿ1c8Θ1c` ̜9燆@BB 0,==߿XxK jF|`ZZVzax0٣2W{R)d2HII1J"fĬY?2_i·M'O0'a(222w2/cΜ=7w޼3O9v7mR՛6nCpoEGG7iҤcNP؟C _6&3=O1~:\VcǎΜ9kĉ%:ucVp_h:^kӶm3O>[qٳg{U*:R1^v'ϘLyΛWbÏnj=fѮ]Cv 9zo޼999ݝ&''?|`钥իdѣǶ2h>o$cOP-SrB)WyX~}p .ZرC/ZHQ*A Mv„if1YYY\V͝;];.m1cz^2ڵ _ڭE _3hy撕WR*Q䣩r|}:gϞ[n5`/rNjʠN:ٻ;'}PpP<:LzUXi@T9S {ԩoeCzZN矔w)7l4#LK.]Y{ժU|ㆍ\ũS𣇏v,:/^d֮#YY򄄄-[2iӃ<|L!7l{Çܹ[b#*ݻo]ֹsEI-_q* {蝻w4i,%aMDbq.]-;]BDbӧO&$3f:}|99Ҷm6-0͛SM%bdԩѣϘ9ŅO8…wQvjs镐B E)Jb׆ l AD_{`EE@JMH @zO.vv&Ǒ]Ի~;33γ3;;'~葔1)-C~iooB~>+ܳV–XrT*]xqNN_< u];i2n7Sqgҗ,y;>ڐ>AHHH egZ̫+V,__[q9Ç'N`Nf/DTKa[rD"Դ}38uꔥF[?C.&,,lР{! <8,, |||R̳s'B`挙6lPjkkU׿iNgtֶ+soTVV666Y!Cwߝ3g#g M*%Ж׼{1__߹s̝;_xG[x;Xŗ^1c? k KJdg̸$63f̊矿C_j[K]>c[oyk^|]wݽ.=ztrlCEgϞpeŋKJGaX1Cƾzֵ.]18![r9.deE`'d/(etΝ;4D܊dA2ImbIpG)Q뭦daz[qAڟ9@O\w#&?͛/36.F 7ț4Muƺ_^h8å]}? >\3CKukJAinhE3ٲUuKͳ2%oRw= Ldr_Cmm{ /Xa8ulRRoAvr=b5n&5+z˖}=4Y[hll?222KJJ|yӾ}[xgm,@Azg쟹=hw߉,_wS(AMM}[RT,fdd⊊E7ިy /= Kv²hmE 8 yq D%K(aJ%D"hjjd|K.yzz ²(PK3ɤBQſ.**bOXF'qFOaœԨjsLP@FFFcccpppQQZ7LMMM|,P cx䑿UלeFCJ 5#uE^8ؘ`| hGl8?~şřbbb,SVVV, Ѷw߽s3l4TtPUYm5;G;GطRp VSVWWSEtOccX,J6.'ex߆:.ju_\wh%8ư0BqF pEE6+hژ8JFXLK!zNr^ CjzU h%8cL"İ,T*X\\ , W-s%J5L&8qH$JsA33aKV[~NVV+kjRFb} 4K\ZDžN7LDII'$$dQΤ).)аÆ vؑ0̈#/\izt>رc/tZQFF455egTUWq?z(XbE%mǎIII99M&cXX؈#zZ6;mAizKĆD@Զ`Jұ,ZR\" cccϞ=˧'dffL#Fg@Ki䜋9Zneǥ":mUF#geq?8>j@ݻO._5}4GkqƦ&~>*`}C᯸| 2iu3Ϙ1]Qgf3'sNLL8q^={VbbBFzF+ PU]u ϟzcbΛ7w޼t+̰' O2{L^iCnnnUFFk4ةm.3+d0Ξ=kڴ55f/\PTSN;w0ΝkSN뤝YJV9u>-gϜ:uJUUV۶.e<>a)gh5B ,,,//h4I?!!!bnn5d &'D2|XrQQ9*>!A DDDLx~ÇIR@WW|ZO0P(2dHeezZCbX,̯bqHHH^^"ԃUl8iPX,&_Q^~aRT(XZZ1]43;v4Cnض"^D2lXrر.e,((>9=?VǿVXRZޙRwoTQսI?A" 0… IInn2˹9"6qm%ZVdƜF|ر-[>|ȑ#iX5"mǟUUUBHB|9<6.LBq*[طprBG\|92"">qHwh}KdeĄ.UCcΝE%ڻS˟AgCLC'PIJAZqY߇hJ9օA}#mks98hh8}ǟ)|Fۊt=bn?LFF+|## HOӛ?vKU?vEMAW7;`Ȑ$عs9\k+?6n}>bܹVef}9vn۶+V<ēOQO?Luu~ΌeYN+=}d2@ 0LjNUkj$io}Asc?;|hghƇĉUɄB5kVY6H$ڴMwwU"#Vklh8iPKܤҎ} As-{BѼq#̛?5j6İ,Rt-/&Iժjk6L,"HA;G:CII3{ҠG}lV`s*8kl IDATliǻۢV @hxDqa'M[StaĄX U.T*a ŐDDu|aa!DFDl)fr9zO#wb;<{6kjGhѢE ʹV^GѴP$rMSJYJ˗DG5e9N;9|@(O>}uPTN4 N>]PT~Kfd74ZmR9lذ@ns7wn[۳"1w =PџFQςFP(*+$ EQbǎo?qcǚ 0 E~d|_m9ٖ?MQyy QV]h綰oe.]K8zf\a&ã^j:7^^/zzy۟VU]:/)@Û<]{6+6dn+**E 0VmC ;G8 [1))vX4~u|e-0&HTPX00z D"K <]h!466fee z~]{uuWxxT?s8hj'65q@9s&}ȑ22|ܹF)??/#=} ` `Y ?6 jEQcRG:J9EQÇ?pgݛN;w)8qv(raH{0 SZ^&0*5jWX@= ZUW=z/d2ROO/LEF]k疂=ۂ㸴!橿K$M{SUTT(q?~رW93g465q볳}lN鲳B|r^^^tttWt566rѨӃp*gϞ r"7:m24#+KB zCqaA^o ʹ}0̜1S 655 #FFDDh4@DxxxX>4-7pbshAAiiiMMM"(88xPܠkgBϞ=̝oПr|VE 뗺X$.+)pBDdƠ08((f9g[WWU_λ\R1 OD|ԅ좢"4hQEEZ咖ޡ"shhlpBN(ņv~kuu AYBT'yD"F槺r,{رK 񁚦&X 47ʙ3{+r~iSN4I IK jʉ&L0ATYUjZ@V /#OWٹI}䩈iS?oH5z69VcǎKH*W\{9)8$LV !{-*,\|yiRF(+E>ђƤ7g>>AIqIܠ8D q.䆇i*2""???>"#"h·+\ <ظ2IIس"_rY#ڸ-GRZw]FqDV{xz֫Tu^ZZZRyxx T*UiYiHpz//˹9^^ cǟ٤۫y1ƦF/OO~ӳU∈CFlĉ*(үB;Vd2+ " {ف+UΕ.\ß9N[W/֨ReZGq@ׁ ƌj,k0dj^$EEEŁAA"ZE.sѠh'Mϟ?9b0pyZu,QթKJƤtHJ,$ Պ._'(J pDZpWp3q"OGMM#\k9d T*32>͍O0h^7yȈH %%NH8@`ugaqqF  gδmn>N;w.kԈPhmt ̘e:3 Q皢)FW+,k??OsaJCر6Q/d1ܳe@ >P (yzxW^2[Hac=``o{r!ǝHOLH%Tbvm?4ap:E#_'bqA~9np|B]JH]|EQViI~~A~AQreTHHpvÒ ;bXXUQQQY !>E\BGe{U.\8hVWQ>aڵU  SU*Mzu)p\)@ ʊ`^χ{yy{L/rD\XPr~߽rcV˸ʅ psiӦ &<<\9z/ۋ~cG q4E1PV{! ŐOM9hV))))))wg]=&8B;?k5jqq?: MSM+L& i?Yq)M.yyyt:^q,M3bX"HR8 DwlF,bnJkɰ4id #e2q@Q@Myǃ q7Oڵtlɒokefe]%wcr(99x?SaP4 eŔ1FWt $4g"+Y-FqF?BARkhvm<4M"8?Ϻlţ_ڳ΃3(a!}S!4Z_b69 5-1FqkLl0}+@-։ 3)ҮmtgwiZ*M:'µد@Q!%q(_5ވvoo]Bύ7VVUg=Ï|MTX.͟cA\En-Fgwy5/| qoaAÒi]Yi믾~gdV3zGKJ⋍(*.Y/|-Zނ"z ?a|٧#H$GY )mu 0 yMk׮{metf~9|5IIIbxEw^ˣV\i; s d~~~nEEyWP@yy9UVZ aam*[oNF4oee%xsDEF+@U[kyoO4" 63Eeee555555GEFF'}]wy?,HfT]] s_}7, #Ea_}[Zݾp!lۺUoݲ>U+WUWWT5kVEM2簾>#lNev| ˲׮}J 0=?WI'4q,cw۶m \'|H?0yh>g)oU*W~a֭{m۶nݶuD";y>|~żss!eYh?P(dsA} ''$y9x˗##"tZ.sEEIc2 &pC}]^`4yy{PV*E"@z+ X"H=<8ٱ6l׷5tXmR$IO,<2ϹCAp*A!ɤjMl2nnAer Nq ~v3 ?߆tbQ˳wiӧ@MB\gN8^o0 G_aa[6Ѥ5ֶI|#eGf]ތΆ7<}Twg . 7:͉u*=[YY!u>j{a9YԪTUW&?s6l1uW_y>޼~YpᘱcΛO?,˾ޖ)SWlwBJ+̽^K/^wӦO-{-yƌ{ǝw]Xvݺ&M4iݺE,XPXXUUգF jQVs9jg>uڴ뮿W^1 5O9j_={QG@iiOM0a=JXs4r(BȨѣ,lV^MT!oRn-V`][[5-1П9V9BnYIǪ/w5/dɒ#}23O>4;W_}o^XymMMoHϰ:>:I/ؖ[UWU?CyeŶmRSSCBѣp:e+3ig]R}$:mu.+󫯾z,s,53o͟g_+ʽ][g;z<9zیYsRƎ'-)@4q4|²y{?@&? O*~1BqVi5iҔ@~ۼ''!HL,Jg]!vpHHF75ZmuiNK/٩@y`7~!lgn~ݜe 굪sde3flٲ;vlʕUAg=EQdb9B~q4? 0qRvVfcc۷N1뷟tJ1m,f4-,*w dްq!ر^}uu_?>ߢ)l+j9.(  ZxeXmǻ,44JJJ}9B"QXxط}?X&4&*2R ^p2>aV˯s]W_oGʱ]bO>9vXLh&Ol_12eUC\>~uE\w2#]lՃm a9IJkxcB3 !d-{GXδ]$vo_el!0c7|5%%6l5s&ªMFሉe[nu&rUVYUfHԩv^UcX 2eƍojUZƍNƇ;O?KIRRR>qch+wMomST4} ><&&/iuUUo9{aAYѣۭZ7D"X$*++{U9Ll|6ysO?sV=ݺ_{?B8KaG) Wǐ|{?6bw24}՜mrX ,yp=DY[3s֬|O6a=LIIiDDī/sI+QBKMֻlzh4'Nt*!H?3g= ͻ+(%e=#s꽵E 5e ZI3vstNv z'vvIDAToV#8Bl8z!!CQr0[jK$\&H$E yg= CDfHbݓJQ/ AWpF( G8/R@9FW HN9?Q:;P wAQ!AZ #烸E]YwAap~kAQ0B8tg ,a!tFA?s-n^ vA|W( gmFA~ !@|}ׂ A $v~>~G2Ait|}g H_ @ П! }g H_ @ П! }g H_ @ П! }g H_ @ П! }g H_ @ П! }g H_ @ П! }g H_ @ ٟI%eCeYXZ _zV>Eطk8Vۊ _ٟIRjL&777Hۊ _:bAg A3A/ A ?CAH T6@Ҳ"W,QKP"!E(^PXB(,\Q E$؆ʼna|R+E2Q͚P-#Y:fE,D0 fZRAmRu"j[㚳ЭE-ߜE(BP͗.EQ-;@Q"jކd5D#ZF .@UR@5G[ȧjQ mnip(rUmڢ UY= (—oْ/UKfTscs%kRij.rK}Bfh){?kΏ2kG]v\mc(JՇ_OCdȫgCVRcK+Oh%Y?CAA3A/@c C_{x&LLtAע+o$Սl3w1pg);v^A\bwʔVb'"}XOO(TL&TZR\ԗ34ۘɤ9dc΃#uKB5F=C#kUT-9ﰓPNݡ&Y9Ш7L~Qi ?8Qj9'''9yGM4MS@R4MѣFuGz ޠP(ge4ίqؘSaz:@7UA^!;ZZ.BYTԠW^v=Jgk{cxgQO,{8=F=GtlqM&V&0u] {R&Nq F#J_FR麥~׵ZS@=t,kRqq:`cv(޵;n.wyҕ֖t{&.uﴰvRw֬>,E5UWל>W^ ]x{V4hbh};!C}AOV&ψxe#VNz~ƀrw_//Ц it}cFX ?[`,~4Qvj f7p>x[vh=wUM"+*XB^njIy`_fL5s-ϼ})7wO_AVUh̟&mS8uʍ*RVBŰ䒣GS7o}չt!sg?oK8t9sov~ѕ׉FSS;hдDpH3$ai;FuԀN*"4M^8}㍵!I 9]?i;/rWSS=w}'~`'ʡÆuH WAYe7/MIɃ&VS\j[Fz駖oݶmСf5 -5֦.1Nn~_F2 wm%>F 93lذgڭWbP*ּ>{<ѤG/X`k)ϘEō7xWV*sHymmM76@iH,Xpӂ?[mluu)))h0II1_S=S!k^tSx2 s}aZ {$Խh0J^k^yog:Povڊɓ&%ϟ7k)))#Gvd6nm4:H8#B>ZM+P_R. *9ьm?ӱbo*:u?p`MM;]RSkΛ:mPpH̱FGxL?h8ӶgӪHk5}3g@ŋsbŋ`ɒ%;kY WoBy<̙/LFF$b G*oL*׾SPTě#Ǝt:q~eٿlIH=sf݉'w}ODG_^߆{dW}T6TݾOՀLUWU^z{mI {7٣7v=<=gϚw!OHJJ Q|}3R|HW*}{BQg):p"ɱ%!̙' V8ySN}{)7~k bQ"3Fg9i ")=G*#?pFC$F@3v|u\lϜΝ;W^ ss{F`ժU>>ޫVڵkcjwY p,29g&Ez4AiRV՝>Ӕo5M` [inb˫ ~"/?z%J@"WUU*AA֮ʚDlU'$F466EEXn嘄hXPQY]RT>]p|L- ]OիW[.44ѫ 2%D9~Р:iVޭO5u|hgR͎_  :d@;<<=}|W7+˖/&s$Љ?Ϥ 5CN˽gސJq~/WKNjG?xӂ7->se}NBCÆ$ ٳwϬY8b햢k+PtzemcK2(!jS7?qTݖ4 i+<|m&`?wDo8Zo{igO=ynTJС!r:c,w䈡v(C< "55`}n^[,(EWV$* sJ n)6rKK&HT-i:2VڊfZ P(J###-ciF6tC.1/CXRO$"T"t٢EV^ST\d4.^lV ߨU֪j_{9s8pWՀɠ7j&V%0CpTB_{k]*JX!Jb9/ڲ݇y z^$%Ғk֘>#NWQYK/|˟ʽtKIJ]X-6X|Dpœa"oU_uxPz5?ki5aC](-%,Y+Wx"uu*EE .=vLڵk~Cx7Op=Zu(}Rq|f]KYM&/2\KAԩ=o1皕F@kj^غZh}'+jCKKJ/[6c7M~Rrf͕_Ι3{5EE/n۾6D(<$ $iזO?֏M& ;y{du 7oo.).vkᴯYUV?g;;~IO?,x8w_^kVa? @\wK@"禦&We_^;n4ôdfd(EQMS(&p߼fJ3g=$f#X!,ii@d1}&)c(z{U>q=?KZᓗG "/ fwOr^L3 ?aɜMUp3< aPZz\kMpYS ~/*?j uܶ/ؗ.Hvs+Պbuh:嶦SX(7h# }rLe?NmF h\gN8q"R}L7ܳ ƶu REC`2vTUC KkgpO*R[ 9ʽwӁ 0?,fg 1u펮Ywqbkkcc)8i$.=aoSuQ(!?SRw6. ǁToi2Qa`0r:^u8..W/^`2AbԊ>do뢀Q.A#A2,Odbohc3 YFdM !$eXs7G8ᗍQ>do뢀QnF7$y<#/WtZZ#ƒ(X韀E'ND!_OZZ#ᐍ[bn]0 CqOg#B BD !P"|B(`>C!0!JB%g!3BB8&Bx%bCC9! <[Mch2#]%BH5Qy7S~wqOB(/EQٱRGbJC!4i3/wN O1pH! Ix@::8f͂\`盛?D!"K- _ؙs IENDB`knc105/doc/en/tkicker-en.png0000644000175000017500000003207011436653777014103 0ustar dandanPNG  IHDR2wysRGBbKGD pHYs&cutIME = IDATx]wXG-w{hĂ&wASlĆITl5QĞhƒO,(pq|,qwDMwyg BëuN8pǁ'p88q^i o/O88B8xE{ɓR9p6N8ps8T/u8H\r` Ao.y -`ٜŲBVJZ=&2t/yxq'l|L&.pT]zzv{֙0=Y}\B9R kܬMSlԀShɇ;-b 3yگ&o>v7feL|N=?|cۖlYV+$M~x6-r-uZYlr] @6jj\?ٟO/vӖD~LO鋯^ͮX~Ft0F4{ܐʁR9pmTj܆d:!Rɹaw&Y(*ݾvAuZm&m4mD?9 W 8xEz4-~5 \7?93eCI\sWp{m&|!y&#9`Vq>4V#}q'SFyR)(:$  M6BNGпu~X>4W1ߴZ=*A)LZބ mroIߺ|;d}ҝFyrqw3̱]L{7Û{Yi׃W콴pJ֕L%GN%~t'pO;yN*_oa?ߩը wE %/̦|pYJ5\-< v4}{0Y]!r{]qA&I%2_iq≢4M(ʎ\5@"cT)ٽ>!nK%Bʓo@ݰ&m?{7/s?" X.g_ƒWӷBgquy8{= gnsg{nۍ4oLzW;)O=aoP aN "f<ƭ}Bx_o7v7U_=Ϣ(2yֶ_vw$+<}ɠ);ԭj'~ӶۻyYLHHni5E[kyǺE yB^vaRS!nRvVIEqCE<_MO^/5by֓;t-"qαK8lOoAffE=k / $|عծ~ZEvVy玳1|'vTVKwr;t~ǒOB?]8n/>#g,t6wZ=(Q)~ߟ5l5>r䉢xO78q5DrHUg8Egi!:ԩHGA=Vq$aHudDtd|ۻo)<|Xg/`dTuP;5;+EaE =&8@ODCڿ%^!n:fԛ~_/$%J)C-N->b_~yU;/l:t[cUn9FODCx`){|l<R8`enR%YvPU(Cڶekeyo=}]Ef/7d$/g=!l|KLq%YvP!+jԣƭ+-Z&TXeaWC$K4$KyM`dTВ&~,E{Jr2J 5EODCw(C)&%,4HJfARp>K?{|]kݣ稕IZo>jd3eSt =֕3M`dTEʐߒM}=}$faؽqguFzHp$5M\8qC \'8(pE:[@ԁ7/Ok+oWa9[dNŎ;:Ӝ"OsfO=w#1sV>d+>}|c>35b^\F0m*FtF 9:{qvymLYxlG'R9,׈yqTf Ud Y쩇wdoFD>{5RM69g |r.0{Jv."wRޚT)̦zo/FWHU8!X~T2gW1ڜߧGvsކ#.պ+$69!To]:sਲ-xoH5rvo|A;mdTk$WʥH\դMlIssvu{t*> Isb/Mؘa{"w'ݳY.gA xcbY7DVNsFrը~u+e)N̔Ew&L -!' 7 څ1ER)ae FM6ϿgF<,?/xq%κ!rVR\E&"k<2YaR?7eDժS1z$'8O/۾ lE86yƯg^YlN<ͺ!5m9 طEj+e%Έf mávehcGY%{pdYEVӶxqE㣢'_/I =tp)&Zy2ne\Ԝƭ;]Ol{W*e;cdoíe+& A{Y9<ͺ!r͹ -+.>XV /E5ĕ밼gc/[Du b +gUY7DՋfۻ/qX`hV_~RsE q:,ޓ0L-'quu58qN1c*^MOߤM3!qkť{ä+Yݴ̱¬&+M0>3:B›9+;r.D!Mo^.+ \/ UYSV2t̡dg> kT kyCðc@Q Ke ; Y N C;|<6v b8fӘud +-2zR\ s/5|B (V2t f 'gF-tvhKTNB,p#kTKo+PV.,ebaASu*j9¶]E7{ $): A24ovNFë Mbel'2ŪJOf4U!k]gh&s! eG:bQiՈQ#lY^TWTw`^bWt㗭'ՄˠJOf49HYۮL)~ZNߏ:bQiԙț7 ;xQzCVѓ88GO N8pǁ'pt3>"YCX!ܺri0_xBĢ\ْW3 !7c"C ۛ- )5ke)UYs9w】Swӑ&3n-9?ym5{/ݿ|=H=dB?Ie'coSD7{gW彘iw&Bˏ3n0Si*=? WRݽϬ+d L:mɉ77oݮn_Ҩa3nHα(j8@`Ϭqzol(AHT|`&6s7*UQQpks@s|vTo`+(D<ZwMN_QFαިtWGE o`_or|˫qBd:=5'IK>{dGc5Ɉ䜷  oڤcyy4j fj|&d6&-`L{xЎ5K8hUrLqPR^tlU:Xh!8e9`҅8]AK\2mJ ߦRT.݄ϳ\m:l{Is6T.$Dtѓ88NMg\px"\p'p8pgb^X2OL7S?MoS!!u܏t -^;` eT)) MR>)9]E/a 8١[œ_{^۴g,uW~gsW KK4JOX~꼵Ps1,7mH ܚ;dDHLD7bEw@)/}H$iՐuju/nٱG֛h#Y.:%G3a@{WZaDy9OѺcO挔Ӈ<3()Ik֬!&REbi>C+=&mL|<{m>f+ic[VՊ#) {S-)8?ލ޸T&[cj1*jT\9>6 w ЍXoEc9$ k5$lf>6HJ^nbRgo+6.ql{p${B4sB8]=0IӞ:}ǺEK6VY7nX6W=gJ)3K,FI|o ?Ȗ:tp7QΑN1ck\]01rƢ m\?o1 !c&>~H7z }4oOM w}\6ƪݽ $Ai.T7Q?wus@$)aὛIl֮ˬM y46;٣ˠQ3pܺүNfLd,;3uс&G1 U37І39g-Q˽K$9OeE+dMS쾘Zvk؏HvpVy|Q9k)4%Vz7Ҭfo0g3gb|qӆ ɕԤu e}=} ,ܲCN*J/2zύ!4)ا53/?>\zd ˷YiE-\f\$/)di[6.>gy{z2 gŋ{=d>t|^EnĤycֳ 'Y"=|9KٹnїeP^1= ׭߰V}<ȼYVJh+<}ɠ);T4,c"XV.WKxCAp,=[0b5=yQç{ԈYOq?~p ƭ:.Ri8xEj2K䢘) :e虷Q;>Ć9LF^1$k w찞&v{&IۓLt\p!P4m*p}5q@Kǎ W&pt_8Ԕ+S[m84p씔p&1Ξ=Ì \.Hy8Ʊ}88"X}jy/Bp.=.M}xyq 7j42n9 h4$IBFQAA B`q_~qqq!x<0(J?~QzFJ|[[g71ͷ1Ii32^^rJjj$?$I7(<,C!! Z[<8%R1%z/\bFpM:1!65JSOU!aNapa'aB믿tKd߮?o4y':wܺuksj"HH|aaafZ/gČd߿{Pe @h<0MAPI$>@ٱ r#Gx<^oc}kWyvd"{+WZJERT*VLex<y=rU4M"R*HFW6׃) u* "ȭlu!ϲ7Avmm޲m{~9L2 {})IDATrXHnQMg=.0NYiطo?Q᠑i(Gɓ'7qi@QU(E  T}[aaaa֍v%#L ˗sss"#>}$/K녆 WU[O./.J v̛7oZI{wȹ{+pj̸Rr9a:BJ;4jR~%) R$aɦ8ZTB4]Q sqԥ(*amlZd2 8Hߜ:f=.T*`~aj1#cހLLִiSZmPzEխ`W LuC.m+`T*uãKNA{^ѣGK;7`ȺkӶ]VҤIW)A΀ ֠K+~F&c@pzjz!E 9wX@ߺS~@CV TnIc:un޺N7oިS2H,P8I/ȏEB+]E"S9*BFz_yt:2RLhղ\.76ԯx1 A(޻ₔirFl\T]8yB F$'{(ݽ_d?{h,s#C@@⁠aRLԿhF.T8|\܄D0%40ЀDMQN]]IP5 k>iϞ׷TS֭Z'a0ΙۭkףGB۵m]a׌=ry ERDh$U:Z-3`SRR֭_hE"Q DFM!!!nڵ+#@ Xf3###޽g.%M6(]j]`4 C z"4)rQFy:ȣHR&!U ń Bl}fҴmƓ@D]""u޼Y[0:Njj!ixžSHá/r2SNg<IxNcF)5A!y~&|BUOQ?Nbw׬(*/aM~ [7lBC;wa%O ǯ]\|I. !$I={ӈFyH OuZm=&$.**4Mu:i8f+R@/۱5<7'F $E999e}[ר!DN3y/I."bKbYüO_8JLVtfѝw^ZȚAB)8| '`z3Qߕ(0/^_HQT F$DF1fņXR+4_-Je΋Zh8aY@ (NNΒh(v֍^ϟG<q\&3/eF#BӱE䋮#LxgPh)V\e˖#Dnn ťKw=t𔉓3܌0s;'ߞ}D'(R! )F!ybC1)O U O'$(5u֐ܧ"[DmduU]5mj;B\jVy42?[4V36JO!D{͛7+ Z bP(@ٴɷQcF?N")w^"p ͯ4ڸqQp"рtzÇs5E?A8!8 h P,(JqF?@oA Fh=7iU NyBGN E|H mކcU{Tq<''##p@wi>'rs2{ @CHQ#(l  I C0u:V-))aS`^,eQ|χܻw/###((Q5%] eKم;оÇ<BHҔ44T†(O S(7> ~h~' 7AG:ˀQm.&z܋;! >(=DHH@, "K: h֔1 >iv sd2CQ^(b&*EQB( _ pf™F#΢(ڧW/ovR]\\^^^&qCKi)BqTRmmn޳_?oP RQ^TzhpN<4B¹'lAR"srrpg2`R:-[DPZBFPREQbi$!M#d !Ug)U:A?H$rDnnj5~"5% 7 )-5Er1qB-4)6ԁf ZxͺGPoA(%J#nǂlߒv p+7,80i뺜 7eˣljr;4:pAh¬ˌV'0QZM!¾/Jið@!*/X^tC* ,[]a( &b?1g)U (q&;i`pu@HzR4jJ-RMZWtI>}C*DDٓCig"8 2<%^ID]DA[\{#IOL0uT ؜a% `0e˖׮]:;ӰtA~hq ¸fǗuf2!ipЮRvǏ|~떭,p!$ٵ$$5(@djR"4)a2Dp)AO[A]!*UqѠ#Qd[+nqjhi`E?8#JJ?|D X,)(, J/… 쨍2R@HSTII;mOѴL.GQX1mXȤqF!b3y%D"L.6lmUi fENT_HxQF BKEC(Cq7FNj W޼":.At+u(2(\P 'i +S& U F1Y&OWٌ5}&-AѤ͚`&QT4TSͬϕ˜Mr777vj.%.ݝ諾`%> @w[XXHCԦukW+p8@REZDDΡ >? okO(ͧ1! %8€hpJ+1 wN+Fnzcʎr&g4ix9jUPPp75X@Q< zkoժ*4MK/_"ɬOH4kL6ݬ}Ƅe5jܸQv-lH<rS͗/DK+eGR(@ cR(C PE  @ w/վ!*/&⳷(1cwܽkgi A7AG.]>}*K4MI G"($$0Je[a0c\.gV6m]qoofyVQ-)(|@7>QujI mV׀ ! (07h\O چTɘ3tUƷE?~픑YzpIpʙעԒcB$Eyzz"R0D}(TrDS,Ņ}}ԄcȻhqgoO R>9"00Ю_$i۶j5}||4$A0ɉطGǧ\^~P"*588n^ $i Rj 3fUJeIPŷoNGPXPPp9XP(~0d?99c;uP-(4XeV>M3g}-*J$~`H$J"7F6dALSKC*MS}ð_  ~㺏h4GnӦ ?'7W"#I y͛7jaaiҐ̌;rmY|4Rxzz2$6h34,k,[((.˯\8 kW %ϫ^/h&|VW7F,hiyyzI$yEyzy RS`j aB'N;ἻEQJ N% f͚ݽwSA0nIE'x<!LŐ m;SA 1 CLT 5R&0^zNT\.~ms!*[gf$J`0@|MVt_IENDB`knc105/doc/en/knutclient-en.png0000644000175000017500000025770011436653777014640 0ustar dandanPNG  IHDR+ pHYs&cu$tEXtDescriptionWindow Class: knutclientVtEXtTitleKNutClientkS\ IDATx]wE6KZ#i TbB( ۠ ;jЮW6PP8uMq!0dUUe<7 Jl&]^WBٯ-mZa򤬊`, /.Qd+m]Z4#ZbsQw>Auc7J~%i[UE8n{4nSJMDVDL/4]eh2HV8NkRl<]CRrR(Xnp:DgUjRpeOWʪ5DzĞ@ܧ΅mƽIDr4ZN B 0M2Ldg[@E$〶}nC Èc6lصkguuumm]NNvnnnmJ:䘦tAb\D" u{wR%~V@_1-VaU6la 31F P5$C %PJa RAxK\ꎦ_>rqN8E\>:€bU(Zgg9x7aֱsS9)CEx }x)G( R]wl²i9e=1w+2C-?ْN~lr f|9keǛHJBH(YŋWX^YYg4 !99=z|?7 [i[\<@ >}z…!Wrv.N4c=Vh-0uO۲Ȗ$6"!,`z@_c<ttE5rnX>FOq%@cgRve9n@XR:Vp лPfn Yq`,yWeW7@-b(B`u 8ખF)V7 l\unc߿#\~e{A}ݻ nNkT 1i ֦hyd?WBC*yGiOPӜɱn#{aƛJ0ŭ9GE\T,++6`c#h24cy&8%` B2pS*qI- B3xL>p AO% %ugKbu:/jSy9DMe=8ܰP?+$˰507PI>!87Ǔ' bjR2 J= u:{]IHA{.JD?KI鯷mtgReZI_֭/Lػ#GBOl3ˆBݕ͛_zt%TTTt[h>tرB;qƙO9~|::eq߶m.yA<|衇nݺNť, ҴR9II}̌%.POZzO@D XltH)(1 Wو>އYn6p9^S.!ıb."ŕRx. ቒ`ԑ@gxvJaMpcmȈ ΂.S iQ4V'!WVQ6|QS4.`QUf4XaN#\hR:V$l (1, vy6\ Z llќ0o;*,{,[~Λ7۝F~@Ah+HfO*LEKM4"p^yv~-I:┆Oש|PiuS S8r p~,Ù (ȂԹ?Grt8@g7nPZs7?~x}رr$LIIɸqxqjc?0L&tI,>T0Bʬ‚)4_S[#0$O$R~K7ߜ>'l۶-w͸+x_~9tPvf/XP@_Giќ^yGyd&/=Pcx#F|-|_wG .8 H&]~L$$R ENlEK}ѹ1o0 PT^޽HT' r8I<9Uĩ KAb͒1"0%NGv(k/F7! I<Ս Z t>؞:uRblOniap / ^D-N9 GEa`?i3kƌcO:^׿ծ];7?uSN}ׇ 2}\^gŒ=RO~gϾ`VaRѣ%qzxU| E3fZSօL&S|E5M˯ 1xyC;wB!|-W\.V_$gMp4 TkbzÜRIQ, gfbFyLî9#𤵇5a+t8 )Ժ]߱Ň@Q.+>Ҥ9rfkd*FƆ :dѹ!*b<=<1ef!m8Gݗ~T}v,)꫞z꩗^n??u뮻**x?#´uC\rɡ2{!Ci! ߩa㱺h$ӳY/M)IaܼH$<[xox;8)O7f̘/">ajӺuw.**f-4m 2l޴ o׎MSάN$%u13f^N}ƓP0rL$OK^RL̏y4?1ѧۆطKx $ru/RJ#AJmAu 7T0lFAw*}1_IÞ'H Ǿ { A)u3nCoe}/>$a6p94NWE{*vi=U:Ba `~UyLZ %!ֽI'VV8!rmo:u,ؓ kbKC' ׼d _udqfщⱪb5V>jxAb^w*wTdT 'N&k(M iOKr˶m :cA!$^<ӤO?au^wysoR%7mzxAgyvɧX:3"_|q95kK/4ќ?0飜/ %廼i)*"FV,V)ȑ# oo뮻O?t;`#V9d4M0m]C|_Ϛ53RN1uq _~by"2'i1~@AN !"1,hY=yWޅgL( hbƪ߷f ("Dszw=MB(ﺥ5~(UEPNqYuQ]8|Nu&$D65W.2EɄY)P7<:|AT;،YuNcSb5\vR^[C D% X)f2QFU_zw.n~Vr;vڶm 5OnS&i&;HEӧM6}ڵ{W}YJ_#L)PΏsIc9DK}V]ݧW/uoټcI|?/U< nouRMm睏s]3:wa?~3 (U wJg}cǎ eݺ^xP⨋FM>2aMPh?xms=/iWUU_K.ȺH%MhB(lh · ]  p!Y/B<geS%%Li޷+`5JV`.)2ր RY(Ec55$jN]aLSca+#2;F v6QvOwRG p6|DS"c2D2W^yn~VuEmH)i9 HfӦO59l3 )5NȣVyysϴi/^zI'Yk};wyg?r)9;v|7 2 x%oV0F;/Y2to1z<%3le]y ߚЂWX$o3Qz+.ׁ#`Y$;e5E8-|@h:J(g A?n!ng׮p^D XYn$"f8* ).*:M=1-ec`al Jwq< ([7"x$9ySecq$HX_b/o9~ErA#*S!>TyHAc]x$6g*A"`Ćnvi~%mfX<%h*NG4K!)o|>sg{6N$awu\#/nSTSr<:ay_0k, μyx?l?;VKD9?̙Ü9nժZW_Ï?7ࠃbH&!I"g:˕-$'h=O::xf, b3FC:~R9fsx/< Q Pc6,;G!:'\dD=-a ŀ+Ui]} =;/m'$-2ruVtu1#M?IT*p_(ϐaO]#ez_-rx!Cr*<r=0f9[]fjtF"jK\Hb.0Gn@I7:Bpzn'D?W=V}F+V|طa`閼{8/bZePTh-f5϶(gݘ|9)N,1H4RV3?yAw%+>VW^}ɒG5g@~ʛP G(n@Vb$D"Fډ ^}UOޝ61 F mllb@N~)ZL<,1جtJb *ԸJMb.ťUFP؟():pX^eSЊFk]x)5'-[xB*kĝ'O]T ,ʢe5h; ʗrk_e3"MYT>-a϶(gݸXds,ȬA`ZmQκqns RHRdeejEL$kjkkrssC쩮_hMG-9HEeH{6Zy>֒ 2fe茎UwZlY"4124R"T~Q}`)G/ϲ:(|M-TW.v&(QeQ\W Qx zl8cLeg=fmj B);)?VhJK?9Y@I,Bl_d` ` o%f HD*ϝBp2nT}7:N]afnj ﭢ*I" 4'/HrP߲XCJצ'PH[xkH-3Jb)KOT7Yl1ɻ tJ[zgF (Z>yoHr2)Ve l)aeie`㹆h!jvɲ~(~)3Emq]#J,.r+Ji|C|'()m)lHw U9>@(KI ҩw+Z |IbuSX9Q2܊.9-I3UĬ-_S 滗#Hmt6& 3fr!(Rr"D+L$h%5FВܿW>ZFEٸ:iGVIԼc/H손YwQ@:PN1ْw2pʴ_6?ULӜ9# α {:=] 1\/ x#(O9Hk2\!8=)fs_4-=PtD`|kĖ'[;waɊj/v@(d .JVљJY#(@9@ :nоAᝍNZuK2 ڢX2Ā:aS4Lpqǩe++Eg lNNF_>~g x׸DG04qS)NUA9JOfę&l@h ] Hl@^&'i J ݍεzHPșN@g"hB[9ʀ4O|P)@9ME4-˕~!iD7@@;Ģp^˞l)F1 1RdRecR UǮ_ٵchWp JkLHtiILf (M{jp[x;bt*_jș <5_qH)B h(^; J aeR)-sժ0:vP>s.T#%Ɍ̇Bid]ThRwwqc2.a-576)c:]xpOp)|{|t>WE AxG1NQ~zv_RκJ$&^ǀ=GuҠdh )KyJ"V  !j KN]ؼz70'}49yZ,nD̾״6@R&yԯ_ƭWDӚ2JY\JQו7=%Yle׫~%O\iZ'Lm"7e|A1dKꊘu >/ Gԁ:RTT9k"7@ a_0tەI 2Mʹ?NM^\T+m+:tlAyݦgqXH7JK2kp~]E6`ą,K@Ɋjf +}4QyR=>md[;J2A9ͬY_{ *dMpq\ (8w^r) 0gx0%S3R2TFRP?vj r|t8 ЀJ @Uk52TjЈ]KH.tfdw"S=vbhHd} FS!N$Xl1D vSZN5h-'O3MPSP'V/؈4޼;n{=Cnԩg DmKZ8JqI,X:huqR]r) .dp]th[3!1j4T&(ݒT5lb%~TuHe)jU\.ϸ-(Vlo]^^!sʨ-UTy}! '& `oe(Z8dʁVt5GU Wpn=cr?z3V#.n^P۸תj6j+5L&xCz!ngϞjk#D";wX,6y1xwMŸ$߆ ;yw޲eKL$=C2d_ #_^{ǍնJ<h?^uUqqq45pࠧy c}у xKx+rӧOot҉?s.Y &ؤI 4pУM#C̚5bę?~mxa&_uqfR&PL$}!C 7Hi^zժ>x֭"7/PC8ª,9{ 2iӦ-^oۗ_'++G5Ms`… Q>zfϙ3f㎛iOщ||/ʂ-Tld^x?/z묬GEO?۱}SO<݃H@0"Lɐ]ݘ{'~`?.5Jө2h0"^a !hx [*b`]M,%<ה}7  p(FˬJ-O@I^Jĉ7w!//k5TUUUPPѿn馢oILj߾}NN1c.[&~hxo!3F^hyȣ555G?͛7[7Ҿ}믻~3rU['ھ}c,]JxcQ6xdgem+/߹sWIIweftdzqw}IZlgUM8MQQQQěo0 ts~RGOoT-5Yb $ʴG:nAh$39j $L)iI*$/J͹@ԥ->2Vt ఞ<6ZLëU[R2knVԂ6yjvj{9*m۶F4xI۴)+**JKKҊ UXhD"&y))a$iEBڷo?⥗^0W_a ?bę׌suVzNNN"wѩS^RRG>tV7MiC}kKeQ%ӧm۶9Sکe;u}ǎ@Q0ҥziB,I@Wh qn  v q^:6gy"jBjET$Q-G*5ɀө艝 5u ɉx*h7uFhQ 5rڶm3ڷoz+O?4)hӦM]t7iӦql۶ƍv꧒\ jSTǫ2,|0B5ۂZM6vԊY{~'Y_qC;~iR;5UnܸiS}M6a ګ mR_A7胕e1+"^ZMH}VGG:jM6Biu!FG}X0B&\?"4N]hlG)",@T)Iapi)_#>A;} o#U4XZp飪؀ZqBI{ɓ7lXH$VX1>ntر?~7lX['|)S******LyaW8ߺukUUC=h%]Vt5uuu;+*^x O0aի8PH&):d~%8.~5ο;.H,_t}ܢ|pΊ;+Lrʩ"mZoQ ۲K؆+=h;nid{n\?*/qGzsN%? -`ΆeGYt6 tSu &g:<1YndZϗe\QWwX2שTR trb?jvrFSrƎ;.m۶u˯Ȭ~eewy#z(!dW]}}VP[fȖ47Ǻ#dfVŔ#(ne 1Ҫ{EQXQ< (QykkL զ{ZNGmjGPtU>g!''d(Jm<Ө}QՒ2(Jp,%hIz XmLD^IP 0١(QlPj>m~c9Ə6;n`-sH+:J$aKǑ pV _ˤ|+gb2P瘉,Q QQN=`I))%8Gm"%GX4-|UIL#^у"IZ%JA)8ژ7kg:h)D2^FA(YgjM_$oz-u䥬u883`^Q/#Lj/hv)m:F:;r7[/ڢ"c!ͨHAg GI!u{;&@U5 ZDŹ8 Wn=HF+hFǪ5+M4V[Ra"8JH> 9-fEi)DI$P.ݔGlp<@nxTD۴^H`$-r @{tM IDATAk>5^X@[o}fFiG<SZ Q*$ZkeVbqSQK4 7nx:r 7P@iRrZ %ɽ-K +cm" Jn'OwDCnFY p=OdĶnNDͨ]p Ij}{8W_J 7:XrP1 #!V'w-8ь6*N~It67+RRrZ Z-A-(]FG?|s:$Me9M# ~RisJoJD ZZ_~︔GFTa \zSe@EdS-7# U:Sx )V3+O .N]5p&3mD$Iēpoo7ߔt:S]3~v˻:ңy"H&QQ^r;gk+k*'~0mvGm6m:23gx<֜(gĒ-Sڕ%w>EZ_r?:?:'BB$7k{V C[gC .9aExA JۻSnYq;*+WQUtŭ5 KjF~JZ2 M@C)PGiuuX,J׾AQE ۿG2'b=wqgQQQZQX"vŌ˗o^qѧuҙ'I%ťťŇ?/?:Lbvw/}{ՙH$]),̷rP(H$E ÈŚP٫kr"EI,(]:밒u٫k:F}L5a Ǡ>nPA,.VC)MFU8"Vu!o,7 tjqMAbxpOSZh5]DP@MM)KRYIcA c}AtٽPJB= +Ln۶5u3׮]tͥ/UupF$!2MG>|kyume^]jIJeaR;Wz8$Śzske!7JjjjƢD*?dxup,_Of  iiT',nX(\숪mMKQXʍǣZVFҷ+Y}Fﰜ[/2{6TP@-8ʱD(dkdrbX4ӟ?^nYWWUV\rӶMDuqIIIrrr +?+U*?K=HBԎ-Lf3jͪ$ )SNS>*Mԛí#Gw\1 Qy)9QӋ!jPGoi7ޱc-73>n'vƸ q9tKIyQ-4<  N@-y"C0eЉ'.93RZsGN**v׎ G"#rrs3GxT/fgD{(/)NwJ4{~oM _ n58 Kw\ڹs|'ۻ-LU[VV6ofP7> zVl\ΊTWWWWW5F}q>^?aƄ 6hӻvUU+_=?8c;o| f,ȤϙR]U.,,ܾ|%i g4h?_'xCz!|>駹'\߾}~ZO85zHNȵ-\n+vzp٥啗_~qn<ӧυ^ض8J/ !Pd#PI_Z 3AP 3un}G|{Q$2tuҤIr.\B9ȉ\xH09$_xхsEE]jY#Fdee}YwM @,Y2qM'nA);v{߽7o6}Z֭O8I&g&l~ jp)SZojN<` -ƨ giK5 (F!X\]nf8BDCPƨOAg8v+4LB"$l{/~_O>K}:t|*v8tRTT}m낂;l Y' >9sЙ犭+򊢑HĈC etǯ^^-ؕNSЀeӦx饗i/0[&]yJJ:\L'(bh)=z#F;v,QÆ ΆF >Ónyl}9ZⴰD@sOwH ܤ< l (!;c9a &CVNԼb.̂8mO48uHhH]v-[}uܟߏώᥥP&Qn^[B`ɂOO{"YucvڍF>W}q+B2kOU.flЯ2 Bќ8d2H$ 6l>ra׿HcV?0)T$ΞR/떮X׮]cNڲekY~]죕 9y~|0r 9mL~wt|$f;-ݳ8޾mVH"Miawj3_~EŃK[Rgx(O?Sk8a'4L苹}ɧXfx>t>eFHR ^wW_}uQGSߨ yI{j׫ (!`Pr=. !scSo ]V}hK7_O`%b^{c{0dtR_ХKt!͋Gáh81>\ޢ1#=,ݙu*^YztjM@ADڵS4Ñi&N=4cP@E>Puֻsw~Np A$;?BnF]a_x|ΏwW޴iSA~~>gϞΝ;:D<ѻw<;޻91 #HhǾPܕ ^7O>(&Mtوo,^),D"Hy( K)P@4+F׷#Y 7@M=C~:>n}lZ>)?MlS/]6^nh47YP-r QZ%V}&Oe2hQnmF*;ԡ02^>3x^H4~k:FP@B^(RjfP@yH͔BM (͓tbfm(' (XN@P@ۤP@P@M PN@P@ۤP@P@M PN@P@ۤP@P@Mr}q.4Pӆm ( (QӸk&L %VTT,ZzoK yZӧM6. @RjɢP@-v5ovӵޖ% (UUW͛787'|JYzun]v"P@e@r׭Zz@n ʡ.?p 74XޢݺgiFmv-P@PԶmݕUnXN@)777''z`(E֮`,Zcr rrr&x̒u8JO`du}b;+^a@.?/Z*n h P ./ز%d)ن1_jӶ8}cl[سgOAAqi3?.?\u56m[oeO=ts f6mڴAಶ/޽;F9drΝmڴٻg{ǎ{z)S?^y^)cڻ} o>r>x=fUS#Nxl] -ʀk~l -uBm:UT^['nkjP?!(_$` .?NcH a'ܓ;sr>®E\!78@@$b0~`q[[sҧWt=ŋPZZ ڷp߿T,bvBоE D"H+&IOO IDAT7lFjN3s83gD9rٳfi3]C8::pwwΎM|7nrʊ| 3ztVV֪kxXfl`Rr2Rq $m X[[@^n.IDdh>ݏ;zHtFFƲ!5QpCD1111Ç3777{嗟޿?h*V#߼Js/^ ˖-8z$hsu{/XPVkjQa*NAad0 +S (}(ZqWMM8U.a݊rhq?8܌V ၂B?|E&J!" V v.J8X'εk8nМY}}?~|ʕ|sUSWig͚U׮`/^HS0UsK(fgWIIIJ&&&6|޽??ppqc [*~SN+wb?V8;;hǦ]\]]oܸ}vpp ;v쨹j1 k 6Tk;;1Twۿ~%r(((͖+w> hr9"=CJ$x\\7A-,i8ڞ@``%G)+yK֢ELG&T^R5\];7nܴ~ErOM.W(~3EQOIpwXd))SP͝;w[hjHr|u?# 8qҥǎ-Yx֬c^{kN>m'||:f9~pppغesvle1,)S#V>}q*V?o\'ysljٳqƥ˖#Ei99IM(ppX'2^ѳ؏3 ۃk%L:tFq\YL6P&Hv*~J:'Wzg?~ ӦMIIMquuL5115[4[[[Fӗ-[lRqƍ7NkҙZ;Ꝇ]F1b͑vm۞8~SZmYZ>m cF׷opl ~t6yғT1^>:CI11N_|F8~-gggǍ*$5v];>}:t>}z8~ A:~fPPG@n"GnI7Kog` "!1UudvvvSGPEp)-dř~5|y%S̼s3_6q89R~5+7dJKK d@V B>U{pި|97h^\\ɓ'x<0sڡC~lݪV(1NPP=C,9JJ2dvߢի OwcƁJšYZK75; ٹu N]%v.> >~uᄂdTZ)?͞\t RŎ?8bU7ޱ#|AT@tx r\H2 "cŽg1ӤT(9lg;w?0D5i#x. g[ܶ(=ԓOG<ߛ\n'oP2<-??bXǔ{ꭻ{w#vE~m۶ {;QPԑLA:rc_38ۂ-DP^ep19yr5evڼy 2mcD[/myhspNUc> +_EEZo222Ο0xxvv#GYA fM4|ACC(}vjcf!  ( `\zn.=.]@Tnp"v`M$ –CjK,YXx+xdHOO @AG޼fX99``i ֶ`k 7feP\rojM}+V=77wnPPBBgԞ=-*vp߿R<8@rQ~u-h<_2 \ohQOG<4ǥRkz5qb7n1"Na2R\O> O88vRMW0|A#Dt`v7~uu+w1[X̚54 ϿKC/ڵ+ڵkPмÇy=1|˗/8ڞpӷs%K785@^ؖ)8L`@&`( L`ҁ&L`%fq.7*Ò)z|^v=*j䤉' _kׯO0]'O:'p{ `@'dd\f.I_NC@^~~'MʷܝÈ5(Ĉ;fƱvNh)SPٕ82@PR `~z XnѳlgŘWlNџC t>U|x#yn߾_ڷoOnFڕ&e3 >z{ĉGo횵UIҽ8￟wڵsgU_zQ MFC drALA 4:LLLj|\#wo3 уNbNCɗz$77wȑ]F[HMIIIurrکkhw ~ I.FKa4 =<:O:5''زT+|ʍ7,^5ܐbLHQ+7ͣSY/޻lWٞP9PErg!F0r^]`L;9ňX*ꦿݩ͛"FEM0T&ޣKtRzܼ_c+W$?4y)L{]xaddÇ\v_@U"7 d #cq@S:d\ T4рfòa JDYg]$EE`aaQ$`#ѬFB~N<;2Rw|wՌx'! IG󗉗J|M٦5 8p0h [ϓwu}XRNa³zg JPI%3b?*A_1MLuڔ&qEq Y*$OR[TX}д4 ՝F-_vE~}N@˼7-بVVV =jKDDdDd_Rt˖&&&3fLa;wuk\ os;E:q>Q  |#xmm}?/2ƭP'42O^Y c8W,`dQg5 ˂1ţF̪'-:++]vfVVM5[X̙3G?|EwJTSlmuw!ѢE De早]SuqT  L2(#QG ()YZXʯgl߾#bNݻw?`ݻW SPxD_nؚʪ'؟[ZjʁF*0 u?4(zٳgϮܧw>Zңuhm"2}ڴӦ}V kk^,,:U*r.pM*uɜR(-6wn3336-|o蕢k 5TȐd+*R;j&D8x`{}3ѣ*jƍQ9<oƌ~TrcFvnqK(ZUoٺ!˪`Ѥ8"p%êB*.vvUEVp8P@[ZZ3ISQiAB .]| yh~բ~.C5i9VM>>B\1 Gn^e\k(AbXgg1@Qtp)K{{{-Ï@Z:ĥyũڅRY/Y/n *x5pkO8)ӻx39vww,vJ v7N<>xƸZ֬*@QTaUk9zEpM]}{2(AYo @q`5M ݻs\›uqVExQ@T_bA\E垿BJJKJ-~m ?zxo&U0wޛ?n\  n;ox @;c8^ўEQzN->~FGqtp2#q͹r6-'󎏗hI0J8J"jO6s1ꡖ߳Q+QP4YZl٣?t>uuKFD z pӎ;Z [΍7{Sz߸qQHMG{x0mEG_D,A/7:XFTqΟYQ˾;f>i vYC?qT{{^z]tI.WXqqq'//ߧO 2].k߭udz|֙n;QCTi(a3 )yYYMGx9C*f +[(b4T(-r#`ҥ{vG?|hApA^Hx*ުw+j IDATa ;, w .j+#vj7x֞ )M}bbeW"$EǍ#۶Wvbb!x'7I7wk~,>.UP:DtQe΃e⥆YUr(s!xݾ~P*y<6 N/ðz.8oD6ݖ-[yȪqu/$HRA)"HtTxz^QTʺjԴmvsxnlJJʑ#G+I(c:  UW;99- QP(W<<<.ub_`Z;5_3J+Vk6j-V)(#,Kkm6m۴10Ma'L,..633;q赐 )XZ!IePih=p+WM0"gdd޻eK \vv' 8dp15MfKr@2!uMك#=ɬd]/SL ԇ8*z>VQ/Ej>/ܳ;2ȈC!AO!"`oF*+,76ի}wjq52L_M:EׇҤN<~*$z'\6V<4: U8‚|>yuEݣ٪ G'wP}\߰qZsyäh4VeX ,++{!ATaLЈ,Ř.Gi&ܹǒ)(y/_! 6L'jqL)6nn< &3++|=ϓ&N0/hTv-hD??pI\<`dgCW"wwk{INAA ۴rnk֮  !?ɓ+Bk_mۺ]W[uEЈKZ>?;;N_s玖-[""h| ϬRG*Z0RF *䇒(n"1{F8;X=8\.Tv-=|8u2ჇLݡBp3 JȎ6ϙW9cEAA<8p`= Ѓ$J -1z9h,rmnn~Htׯ`JJϿ@,%`vl>gިas dH4kkאZ mq9r ok`0>RoTQ x<%|W8lئ)6m ^ߕq{#ׯ~ 39d3_=`''rrj>uitCgqphㄺ|eBBaçL2rDZT'MW$ """~KRmE|1wonn? V%b82\/pCAAAx*|I8 :d22[y~9 HIigWTzQ2wR lܤ]R?ۮ7 ՕM7F7t` R23gLitEutE_\zWdZ8" Ҁ Cy((((>qGEԣ/4&wG<:|38ݻw:D٭Ǖ?.69:|˗/Ͻpf]M*eizس' *+UEi(6㙑!!0~DϓuEu3֯wqvVϩK*{eFmءTtI ڶsѲj(-Zܖ ^d3>>qrQ%#'{aԨF4C T*JsfݙbU1iScCPkW3F7t` G2Y/~4H=i++kV0=(#J(\BBDqk_<'رj, 屢.X@8M51ߕL6T͓VZ8)))AA -@޽V]a 7V[1ddU`Йil6\ۯU xݻ'&<۰~!:W; u8 )/YSZE@_!CJRVnD _s ST/^ӜF0EG ^ w+FUO7F7t`nR%L#|VEjUn =1ODUUVzMJˡh+d-p/s8$ 3/"EJaaa>>{F[0GEg@HHhaa 98sp,t AU]+ םD [um߶"7AaXje[Qq9LkD&ǿy[Jd2 ٶjժnN3,ZǐI;numg"xcDzc,:ElٲeZ!C~i:B*:JNT 1rBgqphN"vTS eBe˖ֽ+eˡ088?|("r;zJRC]˴׮?_\nTI2ddW=nݺu+QP 3hN~X^o^y`/5UR Y~믿6lبGoQ-` ȍEǃr(( KT˾׮_'! EqqD"D"H*T*E߾n^^En7d uMdVAoUܹkcF޳gwN^Z^/ՇҩVt<|7ሟf[X\?mwT2`څLrT=g3Ճ8k{24({h7r<&&f|??zg᝼ڴiS?G2JNqX{{{=vc C'I RAQ`tAK B H$:Ԥi 73[B2ْhUt+j`bOO=-jΠ(͠AZ8:teZڄ O...vOfm[Si@i9G99oACabtPTJRP(򢢢d???x*ý)j!B&ec1.j><<9dɬ5"!!a~{ F .1Q>.GRc!)((Niiw@R*x֖fff&&&fX,D+.X"11di;G3ٳg /Yݣ%Ku#?;!QqihqH D2wϑqh:=w ;g.~{ȩ_"v i*x4^Q4s[GbRhB̌x]ƌWPPu;!:71mAd'&%%&%ݸqmҥ%KZjsʕ stwLHH\v! H22z_^K^yri'DZ T~|r>?kɉgϲd}ݫlCŏAgt47(!#Og4p`go#F|ZTGիߪUex7AsڵOٳg+,$'MPp22"W^~K,)-)QKr{zxS9P(zE.NK]F uёz FS #5;~uo *// 8aXYYL.'CC,v섆 i'>c8].| }i,;6c>{VO!̼z˗iӍ ٻ7ٙbr?CEp{  ׭]ƪ{'>:e YtჇz?ñ0L+5E:>Ts{4[D,޿""#%ٳ=՛={?SoǏ?|_֭t{w…7n+( qݻ{nvm7pСg{.Ŋ>JbRٳ%&&~3hйsߋ䉇;YznqJeii)eeeeeeJRm_Uq!FIoCp_jd{ݿ>X[4h`CGh~!IF1|{U ?!Df^-qϟ6mU+]\\ꧭU<}|s-ԭv5obbb x-мaaa+Wz𡴨 |BD'p8N:Vܵ+jމ'dݻ/^X7X*577Wo2#FXr%K,,,`SN8yNsηVge+(eC&cFq'R<,JR#b-6߰2˖--))Yx1 6l%Z{}vBCA|}۶m(Ԝ@s\|ܱcm?  nnniOHH37hѢd23j!"vɢֵ(]M|||GG †u 8h@޺>! B]^ͺk@"GGYdɉ'xEt@(**23x & u/oH76$<{3"Ej*iU!^5CÚ{ؼUVsРodIûPEEӐJ%(//'(J,2A<ر}ǎퟚYƂfR npo"ҜsTiӧw>S3۷ص3 @˒z~?yD;vHnֱvu`0r***===,<|ر`RO+kkk EYYYg[X4秔u?@#:yHoߒoBZ[Zxѣ};!!!&&Y'7oތYbbbBBB&NtĄ///qҢE 6mjj d?K%KJJJKKe29,ggg M;%EcI4hҸ ȓFf$$$pT&rۋ-6h'ܹ+b9+BC?~ɓ'+VB 2! ^v_q|`3gOH=r [jP( oe&O8yҥC%eN0_x{?{{]0amׯ[~?*++cXl3'''rnd33L2RwsQ֮[ܾ@ 8pත[u2wϜ5FR4.ڶmS\\ljj;CHiԬ}={$^^ DDDFDFܹAA ^^Q{T];ٷg~Oc[{w3RG#CkG^^ލ7޽aﯯuT3K!B 1 '[ܹs\]&O7y;iNջ=**jon^mLci5ÿ5<,l͚5^^5t:t|9sߋnݺm۶uuԩ>Փ'M4zh2Hws)>>ӧMڥN8͛7~C(vp:nkkxyyyYYYP.cF'9JTIOY) MbR_?in7*$0 `fHI IJJ5{7vǎ3zJ=@&CC @6da0 ^-* ={#Mzݻw.[Qɓh۷2f,YO>}dKMAM:mԪ%‚5#(V;~pHCTg|IC͞6mi9KFF3v9?I~,Mh\eE :ivj5(eҩ_ڶm5d294d#B=h⒒O9Q4a:0 prr255%m6E0U',\5-*P–-[G٭[7H-\xNG?$pƯ_x~~~1O&7 FrOOπ=ƌӜ;5LLLztr\nǎ[lAV+:d2BpppX`W(RiQiIo9ztƍR Os%lr,tmnS4JFZ@C@6.S$&&>{lʐ\hٲedEc=zjՊNqa̘1Ǐ' w-xEJ]Ls-++Q+A#npo\.OII9tpPм6vdl\DU@ &]I #Qt:\. Bal)*"4dܠ^^QQQ tHagDZcyyy?|T*pw1cn"(&&vhPZxݾ~P*Fq\2]qWgU%E=wuO]*zðSN9"ڜ:uuV}׵k3@&C@ d2FڴnݦukCa,%76 * %kԼSL6 2<77!T@6"T\8{wN^Ϟ|bce46$iť&sȚϟ6Lx<^Qq@# rT*V)((ƦS'O>յ}qqq/^>dz?>e/[CA&@\\q%1"rfΡlAF6?@|]m+BCɒ&N_ƌGR 5jd]Vny+s9!]Lm%oeC}'OǏoZ=nS歩41=nLv%ް IDAT%%{#/^ Y Xz;w0yI=|~nnnZZZAA]SΜD/屢3W] sϘ(ށel DUfÎ# ʾ|rIII.]"]t)))|A0IJJq9s>}tI'>|hڴ...MXAdOTZXX`lqCrhVpJ7ntU;VyFWn%#Ff 3ՠO> c?TZ;f̓'ON:5?1A&sssmVVYYYD tss3DGU/BxbcjV3uR8rdB~itW._2!C~0бe 47~ ;;^]qqq+Q2ٸʖCAAAapOOOOJN{|?^iWWh^Pf훦C]e  }xAAazzzVVJKK}KGE`Oc\ryzu֕J>m&@LN SZ~Pkd7o߾}RL&;;VZwrҍd4â0"׮_۷_"Gs===׭][TT2eNvlղ[lmmmmmL^ CTa)HbP(Kegk۲eM66Hdu2y@Jˡ088sR Շ2VRi˗i/_8{7?+;ׯ]Ӯmۋ. +VZ[ی;GgLӧW]V:~urœPhFAmN{2un-njmmmմǵP'Cs @ R$8q2''b!P( (|>o"QoЪ(ػ7J.UB1}X___ΝXicQATA##i̴rZu&5y~~˗i?JbӗN^^^R: drܬ< RTTtܼ<(//q ?ԅ򊋋Ba֭9BHHLceei4)*"ՏϔԬwuiȑ11211q ʪ_߾NNNwHr@ d ¸xTnʕ& }uPr(((Grrނf9ŢRJ%*///**JNNW2<=܍+sC0RPPXZZjmm9fh//{Gkg@@KGG/?ptUQq$H\yݚ Ah^ge[X9ljkk3㹹6Io:y SZA(--}T*RrfffAP*eeeeee "H^zX"1\a\ -F(̕H$|>տ߾}5׬&>"4dܠ^^QQQ=L .l뇑h^P8 CJ4`du294di9*U^^^ gFʿO* P[q|>355EDTb&Q%W*JR WWW&)ȶ~@ Ͷ ѣW^nPѭk^8!S™/#ȧ.+J  sR3j,$ɡY ד-G"G\nN/_޶m[߲u2ɓ'KwEFDjۦ͂= m((>Off& 8T*E9 #-Ad25daVf>A% f7WW-p1qնS A$YD/ɴ̀6HݴTZZmKJJM%ׯYh@"Xw0fa^GՄMrk ^.5nݺuG;CgҒ'''͢cH9z'~ܳg Z5s#5Zμy:*;wnNpI&!- vvv3fZ<{f  :l'A$I4(h\PlRD5qXG$*W}tif=4+ mjGFT٥ ha/ȊVXX}Qx<iW>L ȌT{tGHbXyk9Wd4hPBB’%K<==% lxڷk_Q^~PRu'Dϙ3:ܺuk[mC? >|ݺu=zʕxxx>ž6@7lظjJذaCQ{ee%Ύ;vh0`MW\0`Ϙ֭_+--upp(**h9, u-S;&̊nݺ /Jq46 5닼V-`1@) n6RTEHٸ!U)s ݻ2 Tr,v8}ݻwGGG:;;}Ģ+Vn޴i\[TTԅP{LL̪UooouƞLs$M@Fl6 n i9ހ4ؾ}{\VY\yטO5diFohHƗsUKʪҢΩ(F״ z!JQJ$5+ÈbooiU<`jl9g֬Yf]v3&_{![ :wv A&N4qhVXrJ{٫WO1c.f͚5k֠9xL3ŹmGr|~YYYyy9ATRzPZ&M$O NHͦimjB0r* &jڣh$ /`0e˖]"¯y}||rrrr9p;uԦM(,(U} ;&Jc[x0~* ќ&0xkdk9eqwwޭ띌+++9N``P(DQNNNl6[$$P(>MӍtl RݻFj6e2_*ryvv1SQ:!ƍ4MX{Dr0# ~*X,@ (a+&ZJ./^$%ÚM3ƦnkNEQ[m?rHmSQ7!e }AAAhavΚ?!reϝ; Xj"wHܶm{Jjʪ+Q[`Сwd\ZZZxBעF<==i*jN&tt\liF}e999&veFƎɟsIe`LDTt괎Somj+?|nbtt߾ yd<fiRަG.p\%jصЧW^&f$JV\yŊE͋i?s,tMh|>߿VdСk֬=uEөS``0 IrOB/T*-i dk΋3_s_rX$){{4!U's-Ν;?s,1s㏞={t쨫WG>|&f}wxRҡT`>P`-I+/02j*''"T$X 9r[s~%E-Z5n5+++׭K`Xqs윗W!@ ggu c&%:q$0 Ŋ0u`0utG/ﯬr* [>ߩS֭[<*Ƶ.(j%S&O6{>~x@m۶E-^>oo,9p+СCϟpgf @0&w.$`0͏ŋĶ j~׮]K-\-Zf50;K}%ݳ3 ̙]cW /++#F̟?⣷*c͛fN+q<`0yQk`B'@Gݿ )lټeff5jԨQ,su-y`0u# o )Z߸_`0 r0 4O`0 y `0͓*c$b06~i񊊊7ӧOr֕[V4+`0h"Hr PoV @)A%%ݿw﾿_ ˜I0퀯ECH1S\Rr`ғ'OPT*( I$IH$lӧ7;vtwwk1z7;q;[_ _ [#ؖX⯿&3P*E4~b=O5^ZZ*H^}U>RojΌ*b |-l|- ELJB*M*i$yOjRYYYYYYIA2 (J*cX1 :ؖcfBBBnݺeQ`ϟ7nT*XqE"P(tpp BV+ \N$aM]pi9fǏfFH~9!!!<'<<|i=Byyyqvک[Eti^c.>|HR\HB;Ύr\6Măa;ka;Z؄-?dRCI ~w`oouV۶ ;v=S(Eq8fBavv@ ( 娟b˟JrU]""DDZZT!C>|yyy:tC i$(0,f$Xbǎ8i"\Ϡ-ZfGڹ+?/S`,Y{sfGtr //˿^p8ȑ#qK. =m2 #A+5Z.//GVJZ4밞~5pPIcb__ ۡQm9VBv]jܲeB>~yضs{?j}ꫯ'OPi;;Zmwyp\cFiBxxxd2r9r1De0 EQ EM`bM- #,|y.K?0T(dL& @kY ™rW)ჺ WQn|b0uk~j$[Π֯OXxD"ٰ!aps=ڵk_Q^t萿+++<㫭ZjvvvvܧOhTptt|FY=jU.0;{_lذA_ڵc;v _~7n\rlظkDݟx;H֯:88i:ȖXfEQTnPrdJi>r~pQ.@tH|v>ГN9Sξ*@e@/y@e\I#i9ӦOt'N,,,tvv}TEFtذqCX maLi fI$R4 B*Kt```rZAX Rd+srRxəL){3  fw gϪ{>;?z[oW"IiooqX/oxe:X.@#i9g欙3gL]vڵnk۶WϞz,~0f 2iҤI&iu 81z:RXP0p@m"VXb ^{5:~~8QrsŹmGr|~YYYyy9ATRzPZ&M$O4y)+{jɃVk P jxŸ T}sȴ'Czxs ]s)3d;w2N<ܾ=߾=lpO߯ή;r0l(_NS,))1X{ [ch(___JTJP( T8sAaŲ0eA>sp<.go|WrH7ۓ @ZW̿Qf ]"nù@5`رpOh䉓5>ʀ ,`-e<(ڶF!A̛7e8^)wu$۶mORRi׮(D*J.(/+zP4M4Ͷ pXU<ȟD|٥B$ȆWB 8u '9P=>Qn~J_?OLq* sgfQ#@ΒY֊l ORɽ+ag0%6;_(W=w hӦWw6l8nG7_4=~BgN)T"?d/C)0}S n;cBQݻC fee}~? &vFZZZRAP8t谙f=r2ra.̠iݻuwee%  h6ɉfD"$ @iZ^2(jrMX,/E䴓k#T4x4OuI \KOOs|'(`bJH;/ !WJJƗ gfP4Me C^;6)Љ'aX,V qvz/5Eც2GDDhO޾}>J?y ;b0/lJ37EX Ӱ0fP( {Y^j`Xr6RЛlL1 M*))pĸtsDY=w߮ro:x<AmEb1-TFE9n~` yrO!, @<"tl"Mz']ΖJb '[+E:8tv-xy+vv3d*U_g ̯m/F5jvWHS?:۷|ׯ0f,Iؽ r`n\>&hac]ѷ!]gE :~֮={@ ~gT^&)GR-/+tpt$-aZIOOZdqIb@$MKK3c50m瓩S/8aa`"X.,= 49rWy= + ƺ0406"=?u+DU?UVI+#͵Dz E7x#ER~^]57U"g \`h|>_ϮSê94a`vRAQN;M<s lSXYaRRid Q w`^kN:/"=k2d\nX, ͍K9rHi 楂@ AVˡ(ca4`PXZr֯ssscbcoߵsw0BiPV܌ -ҥKfCU@fu'VjP4M$K2g_ V T{VO)#Eos!f˅<3V(]a0à|9S5k*CtCx3_[ElLKK1v]BN%%mOL\#1;eᣇ36l˿_?._44M!ge,-#divi9Kmٗ-< Yp u*oOg"LH U~n[Qz\XK.̑$q+ &`.6wE;vhn6@p6ck.]b 9sn޼e˖W\ vvvg^n&o;}?_xhF8 Dr֯#ffseL]K2`+@+ G2(z+rٹ\8x`gW勔HAٓmŠrajj "Ɩ ò^$9s"Ç:mn7hЦffnڼETZbƍcXB0vLhbqqI%vZRRz6nhqcوLu(BmƽQ[^|4i̲oBNi*?5)Lq5,:O=x3m ""g͜WV6mܠ3b9j܌ E||,1 S B(9pX.lA.̠`0 ?؛ MG1]nfg9svzL̛oǏmhP ͞b*Bx 8O%% h9PRrQ|%{[1ފAd% [Bh @*7yxۇ*iʙr{s۞mH`Wkϩ#m .n瞴Dh X. rҘ!Ϟ9V'~D뫚2H;w;"JɚqvN%$4`H") Tڀ͵=N>p ^9pN#/5.%T!]~ۑ_ o48>&PhBn@@Z `[ҳK UD@*q?E͟e\IcE5-`0fSx.pަ?8̩6nHzv࣒ku2/y4ט[trad?&X`0 ȱǏ|׫׬ASSJ$S6'KD[WZ0#!Um5P@]])*tѼ=?] ӳ{?8!Ϩ<==o2HgϞyø$_忢hS ;@(sgnSre)]˅5\`-ԛG5VIvֿ>RVVV5MS6.]2ˣ ^9VUf-a'ĺμͻ]-@'DxM2T39E䇑~ڝ\s5K>ƪ$dU gk:.هy Qa0cP*6o{BFPY(ڵm]~}Eմ,|ހ+WܼiëOڪ]aG52E-nz댯_?Al[ScYw4tЮ]E:uFؽ[wLYߦ?&UHe2  -lr(JRC c<$)bV*c$oi:zj^X)YRX\C;S^[+Wq?QXزDOiYYYv^(*/S$YH(GSTII)Ԧ!]gߚAvZph͇&6qРAE\PsZV*U"ub/xe2ٳ\ e舼Q6]&S_$@ RLaڐꕰw<5@ƍR3JrCV[u!h1}/(B{[n gΞݾ=1;;7XxQӧOoݶ=''GӒ~;8;=<<>*Ri~{?n%֛]v\4 Sajqr'0-vJU wF+3RRI ^׭[ݩx~6m 8(M];wEcb nk.#ëW{4{H;noщBNɝqǵ67,c\c|9 ٣vEh:gϞiyU\\eW41@Uϗ´:uYth sa\r0Q|NQz(N}LAq׆vq7'UY *9Qt֟*?4>^ q1L% 5M!|>w s@ db0E`-c,킂NFbIuage3^xPh^(:P/<9 7E޽;wnlٲ9v\ sȅ>GȰ׬Yi\d'@RRRoK.>}*ggg_5=h@Pih z9_zkr+GkzEmS^wuϞ=m8H9FSa-fߝv}8p|W^yei"ɵ7>LFXzxFY,24na׿ƐFٶm=2I׻ r|- \ȅU @#.>sǏǏ;sRiO6ի_b ddh> Ý7G7?Y5.]4999aZVWjp8۷9΂ lsUۑ>FSa]L&ҽ~GtH㏈. h ,[3 $KVH믆bQ &7r?0\X4jU-ۋݻ:аk˙=gA}D.Ȑc^8΄ pRU׮@۶m9n``Zjֶ|_7n3%%1cx NT Ҷ7,jq##;;~өkzr2NCR[NNB9%;v4//ƭ 6m4X}{bbbH,:ujz6/@4 ` 7]MICTPPÑ#޸1ccǎ_^{ѣ߻v1VEnݻw?peJս{wŗ_|#q{~vO߾;v$~;XtLh+#޽v[_#j&#oxo悩S,;#eKkD*Z Ǣb1S==Kd~gh6rS˅i\y#Vc|'ݷ}FWKYT$͜n/2ԆJGe2ɓ+߯j1n޼u֌FOmGjwwn _yyfX;ݚf͞r 3f X#'N/?_д9ggg59}?&&V t?Y8oiivD_msD($: 7{_*RiuƊGFFɟNcbEpk0Ņ]PPh?|w/Y5.^7Jھ}W9r{6H zSa$11$IΈ׷/^v۵ $2蔧s]tuuu=slqqի)] ??ls khQ777xvrFJRR[{SӽzcصA>c?ggg5X.ZüX?p8gln} )b{'蕫WW^fv_}<jL:#{6^TPP ~ՔonyWܸ6lWZڍӔ$ "YZT:dggg@_vc̱c|"(-sQϟ;_XXRܾ ^M94}wZ /*?՚a̙oӦ[olvUJ$ҎJr3Sxw8;P*| 5J[ǂ&ߌ|Gpo+++-Ŋ7@{i^ڟ[;b#FN2&[lْ  +Q+_e2YvC u0; };9xV9s̙/&U(h>G5e$&DD"L&6{왳v;NTԸ3 n޼e˖qgI%N }lG.6޽kꕅE\.'H/G]*.nIt-[DOXmVVE"Ѱa waUkV=kfQKFmt!d߰q}ºQf?j//!n A<~i4E:uo\]]cbb&NTcO>@M<ڒ6iwm]B9r+x&O@uyjko||"N 7rD\. B$#Ghh& MۘƮݻ'$+W~zVOͣǎ'''mx/һf"|>_,+ Iחݻ >te]4<G`6"r00uViwsu]b^̋5ڵSN7CMԈ\M ؤ#5y NE7>>uoc7n%r9:ULY)d(Hٹtx+t<=< %%Uº2u`ݺuK.-**;fLIq1` ۑ \XUV#& |u # .]g{xm6qb4UP۳J,{"ZO+VNhh(H$[p@NOOw>Kz̻]vF9!Br0hӦ̀ڵlgvŋ]6/^d] VZYjm۶hqU6;6C-8 wpI ־;|a"ǎ^,, `0f{~j)[Glݶ}bEcb nkWMǖA] O &GȞV͌>;m pss;vO],rѸ`-4XǼ[EU S:V`r[p@?!-;!X.lD.x ~u >#ܻOV1Vy{+49P094bŒXB.`B:~T*VXX⦉`r˅\`-0zR)ynZN ,`r[p@n4\Kr0Q(gg͢@ͼ43R[QEfLn#,fr1Q<~/F&[dh!xAЎB`r[p@n4\ r0QK$;Bg (`+>()+(HH$9}X{hm'ra.,$X`0F{Jxx'=RR/̌pw-, `@-y=[{\fsd~6,Brr0Qn@yJ6ݵk@6+]BC-t<X.̅k9 Xt-kz`&D"& }pȂ ryܼmڵ j7o~JRkظqѣG|)L6Ml3;;[nNDʀEA % s`9 c, ''[%;G],_zΝ3:[9{u֭{7bcKI%?)OrMLizO+X.Lrr Sztq33V2eY:v ngÚJ~@PDXDAR(PP, )v⪈)* `( &W10'ϽΝ{f99s&r8dedd' CC!c JBEIIIZZyD=/PrD'hkwwَzzz+vKEE @[w arX%-ͰF[[KII ޾}Se{_t d NRLxb"/*,?S000p?:e Y n3gO>yf͜)JDml=N9@$d2J /P@ :Re" p^zVVV/WIIIX[$kk/-"ӭloR$5*l TUUtuu߿_UUUXX+Vw/Erݳ23+Kܺ F}=_y/1:q7,,D><|8x(4ԗng|4+)mxowHc96{,#2P"r Ggccˑ$={~z# 59Ry0oݻ9;ߌ SQQ>,))~8~8'nZV [-AIIbd///yyy;55`kh zjRlIϞ\ {E͏=--)Tk%Hv PE"m$hJMmo:TP %.?u_X ;kk ĭ=jTBB4; /zP"˹vٳgrC##gܾ?..p7hϋ-_׭_,)g~~~<9dfeq>]!3+믴t[;7ͅ;w<|0dϞ?dTԠAZ-[HJJaa^^^mSjma rrr]\SIB%3kj:TrtW_qD⎕+4)d/謜c޽u ӧOۏǏ=fݺu?#F3O3zݛ7y9wl6?m-ƦM8*ɨ((eee>|ظi?ə9ERR?~K^ÇKJ򽱵dZZZ?/Z_)))/x:]D"T1G.xO2?IH:mݙf'=vvCtٕ RΓxo:C&NHL ¥D78J/PzV"EE:uJ^^Ζ*FjǸ; GqӪ%MΝI,pN??7o1}Z܍-ol#W:sKZ+iu!DN]rq7=`CuuddeyRJ''))NNIϒq'8p 4hP#)ڨS7z IDATЗ" ~|D/Djذa<իCQTT:H.2222K؟:uV^###}JUTUUG^j;y***Λ?ZXX{ffƟuf܇BCC/Xsolllw:xKVҶˏC ^67TW+D_?mAEEu]u|g*T:]Zw=!˖VPP}a\mrv6wbrc_~!Ҩ?cCC}}}o'yxx,Y323SRx\Z"!!l6[y3M'KIIK?~,oGWWsL&|iZs!eeeÅMujBHM}mEMMСC?nll(//x83gǏ?S7::8KLlll -tv.155=}L}}3gLLMrLA00>Y0'WTpBΫ{@Q>/DGDؿoMp/1ww~9:9~\vCmmll5k_~s%22rw@ϟdp4U9OOO%Ew]\\VlrrCC?UT455)))͛7óɺy N%BI[@`hjB?v>>l m>.n FF| ھcgIIɀBsatͼ;<s„Y?Pg1y_E_lypC /0=pwsojj*((433c466CEdZ]ŅRk,'/ϓ7tU7O\DOXȯ2Ԝ>>RMɓ # ղ;=ϓWZtrڱc5 i /"~S[S?hk%tk['l 嚹_ +@t5 '^&q͂f@+8Ƚ~d>Q,_Fjvp/&8_p#~] 23K)Gh^aĜ~;`Wccy֏;gΘGT _~!JϺIJ$]~=00šs'aׯ( ~]1JƏ?}{&"~Cw~!`p˺a8;ܵ;v|ӧOʜ>m޽8!@Bj~7((TYԯc9o޼>bG@Y9B4xz쐕ȫy̚5p%G'~s-Ҷ ҢEustȽ*\,}ZC5/Zh ڎxE @>l9sƌ@MM TUU3_TX 19YY_[TΌydm7lՔ-_ # ~!ddd~^P YVTT N&L]y޼yөBYb11T*U*1}:nr<_+ӱ'L打Q`d b?$w*튞/^< ooDt #dשv4@ z:6ndaqqSWv9x$ īWpa15lrڷwOnDt--M%%*pVO;rDOGBBۋGnooooo#䛒eACCCWW?dXzzzzzz֨7'oX!w gip?/z|eʖp #`0J=uunf((̝fdfjjiO`$|Ac97 /`=zpֿHIƅs$x{7kjj:LdrF]]@3fLDd҆dsӧ7ʶ!,7oH] ˖/Zb\vo)KKEVVb|X܅GE?LkrDȑ#gު33tgOֲe˗pQVVda|8rdƌI6wΜ/_444̙3GX%D :AkTTTlllNFmfzu844/7m$%[z`,큊v- EEy{yu.kXXww46{xXYY@Z_G#޼ɫGTUqߨ<ʛ&ܹfdUUUSee*}ҿmͿ_~м1"//OdrCC.iC^H8F>9o^7 cǸX[ٹCLP> lGE~UFM&޻UFf櫌(<}, 0mK%%]|yƍ:/oܒמ{믗3H$Ҝ9siAAA sUTTgh4h6;Zґ |_RR !G Gaa. ŋQ8+Q#%%vݺ#I}}=YJJJǀgegq񇦦wt/A'O ƱcG[Kyw :tܸq<I!//___Mp/R5| ̝Ο;666* nl`d鲥p%&JL @Xtyr@H1E~ᇢ‚sgp5%*Y._9`~͛bCW;t:sU˵4WvA7mְ9|Pff&@09c={Ե!n 492իF <nzƺ} jjj...N+Wv,k׮=qY_`AZj)733 >yիW YkM@ _{}rJkg/MTTH@bJ? ­OQK-MeQF74-MMӦMk#ej r(,,RT_ ÇZZZVartVZqֻ￿^5jT^ޛH>* Rܚ DrG& }dzb%~Fjk?ѴnHJJy( rrr̝əlm=--  ey6nX0fիV[ɓ'4Z[NEC^bedd[  `())q [aaIh>SNٸa$RaF"0 $${jjiKJJӦM6mǏo޳gLZ9/SZ~h`KT԰xXo7/&-pɋ L}ΧO>}̿?vsK8fLN `i'Cuu-'OJa"GDVNyy}R_`2G0ptt8qR5CIIÃۦa2zzzZa[[GB:.''ף|wƌz+>~̙oct]jڵk G8~< J %Lɳ҃*@c)#yH 4"PUj&K $>UYUL}?SAoFt:K LCؓYUUUdMd2X۰lhjjL)S-OG4ϿN?f5eķ-"taeeeww7ADdxy{2{ӗB<{\d 222&*eg˔g3KRyFn `_jo?zh*-B ᩨ۷ok-qCczJd8bԐfK[1,54-@"V@dakUlZImiD'Re%E`A[r#T"*zeɘlUiIL!+0ZD"Qs`OO~əlU.= xN9;{/_|_͝3o9s?B:q3v옱ðȈ7j-&[##-.z3Sx񲱱i8@eee@UVHrrs)i4ZrJ7oODv H>XZ>N [F La6̂ it"_Ԧܰ J_j(Ř'W$c%7LtϞ eo[gZ;߿edbngg4:&"}VG~WҙL7ii6<ϯ]513|hfBF )o q4}&'wtjEnx[Q^Lq#Aaƞ:u:??L&>+1* "WW?F:5lP\nggP\);/.1דۿ/0}$(} |M),,zi *jŰ tbYv6=aäyi N+D:˗/{xxﯞ'Æ H}Y9?libb:o߼ۻo/.wrr5zǏߺudٵjQ#G@|IٳfLQTn a3zBc,@hx G=z×pLʞda1qEVVdK+WZ=|az+?~Zڜ8|ۂCW)|"Oz +W\r%UFwnɖ'[r|CBAP ð?=_>'BsddްaVS۷|?ƌcǏ*:fh9N?w{BNOcR <9Y9, `75W䌶#^v쮬LߌOy}|ێ /RS9Whw A UUX37`zJXX;Wvs3@ H-,n5&0VFJHNp9E:U$'Osȹk81t3g8ARR`w ٸqӲe˹}iA  |SPPpzMy-wϷ>|C-oV |˄irG6bT|V$ vF Vy&leʑF|Ζ[]oc?԰ᣇX,˗/-^24^B 嚠R[;!CmJKKJ agϝ322477;n܈bݤ҃%&&a\(;[6W ,y' O;t0ѵW]FSK[GQFE bY94(88;+88$D`f1U᪛{dD@ :GQaAvV泧O qsU_(++JB4rrr""#gLrX\Zu/_gMqv*?9n"MWAS+٧G#z&A ]AEEeӦxEEϟ?FSPJ 44L.>t:}}rrrΫ ơCXSS]m HL7!'Y$&4gPgSFɭz\<7 KiiilDAV t:=2p}}055=}L}}3gLLMJZ#3+/pNE⃻y6ߟ;f abҤ?E\>|bu-pxyڕz7ӳGI*J.Sn`@UW8cA~ i|(O9E=Ƨ6_ԗ F|r6_{m =֭̑뱱V1€#0ZDpXq{޽{m W*C:N!+6EC Wtm>.n FFDD9)Mٳv7ihUL&km߱d! &ߨp򁽪X⾔+!ڢ3iDD /鲋MM3qYxr}| cY.C ݓxhˠ +]~;ytKXCaSv|nSc«*P CFc?u/I4uA oWZZ G"DիWm"D8t 444$j(4**'O4iՋfȝa'[?ۻ7gn)fg۷,%ZںCm Aoaeew\QZZ0=}S3 #:MM QQ? AΊ%==?~suuٺDWWt*ӧOC))0]ݡ˗SS_*RpM!Ey9AA6m!oD" E 43> & 9UUQQ0nJJh%rxrR9֮ cGpw{Vuuu99 7>x;̛zVc[0_0eC # `7I$kjkADg}"137m"j6-6vؠAE**DRG"Í"HJ}w>666fY,fϚ^E466{ϝ??zo#>=X%!!\"AZ8999nn! bѪodh>,403ej HD`lhkKW9Kܧ|[{ܹsV¯gcqIGrC ,#0 u+>,<\FZ R]<)rU114sɕ!n GVHdX,U =- ʑ\>{2+ +W::@IsC z>l6 @ "+GD[f..SG2U_6ɹ ff@Ĝ_`NW;<ݶr"0 f0@4c%|rrr͛6͟?g+1B 5` Sl[r01KUB "ČrD@ @ &#\YA?vl5Qd2i*&YUU%n]-'{MJ#UW+-cSĚl2rbl6* aaq7o::8,\h,99d:r2m4퓈M98>&Ybh /l6aB" F577a0'NFQJcťa߁-HKqX,W gL9S]+ǵd"Aȅ D9cðSNyvegBߩ"-(oAd2qɿSBBtGIM鮕fD"7q@6D"-ǎ:yMTYco\08YY@VN_E oUl6X@댕 Z 98BYYY_<;1;޽ 3gcHtttB\f/Rڷok׎= ֯((ܹC4, ERR2--x,2,"#"fϞ|kݪڢI[0?`&5Y(YTp!AH"c9l}}`w0l'G"A"ɵ܎NBL4q⤉Sr'!a:CtgΚ9 jkgWZZWa߿;a?8c?{|kݪA[ƱmΟlB{BC@A},`ߥCݻ/^;; &p$-}H{{{!PKKgP!("qsg@ #V}]9_%ǎ'7o\M;qjjj<==k0pqusԔ[rHĀN:={ۆ`W_kx|kPmo7q_tE⽨ p d]Ą#W#Aw HdH!~Xl6A+ɿ/|||+++-_][W'5p/_ܶnp#ԩSvnaaq`MP:eܑSS_ފ# 'D4￟d2XzSa0aG޿ocm켺e,s޿;gㄑ? =z&97#!22"+׃ѷ0,++;,<<55x͛6v˸]VZqz,*چgILR^ ZI@ Ɯs5323ӌLM- L0 ]G~4,((9;;{MGw*qgP(2qF29_@fVXq4M,Z.)ϗN}).}Y9B`,Yn޼ތ +VHHp/s JGG;\u5'] Pͽt 1 R~nQG9~|VDIDAT$@ 䗃@ /^lO-[/]RVV>}*v._ l}8.8)))K\JJJ߿aرZZZ~%bűc/Yhq֭qz%˗0t?{\QQϜ9?x!wVVVߏ?jhwtp01%=;%%W?qD"X` X5}x]c_ˤ$i4VXaXMM }ف#22CtVPe%=x.|2,Y?]x˗//]$p+';;L&OutZZZw$I8:;kŊn&`4SSÄ1Btw,b1 L6 l@tB ]ng2l }%HNw|044~'%%iڴ|%|NNN)))И%p ̯_0 ̎7DUM_ ut3Bw,)bqvq՗/@R|%|=d2?~J'y"''{wĵ K ( ..޺Wbv*ֶ{Ѫw\[wVkkնj|ATD  ̼1 ?™sNd<deeM8igy>EED~D'q}~`[/׫߁eeeDd,c7-=})i}5XcU&aؾ}e+W,ꩧ="o^ӎJWW:+L&8-v qnnnÇԤkk^^#!>nIzDD]kI[o~ 4l`VKV8q"#cCD͐el$II""*&13H+ , Q.Dcf<2URpn۶޽KD,ˆ5C1BCC|(UXli5S.J=z9s#<҈A-Wii_KM-O}}e SHJY PMTJTgIY21MD_|̙q;w|ȷζ<u&lU4mx36=P(:x05u&e٧iӦ,c Eyy\.n?]S[xxK_6+W\]]ǎn:":1"<|V7nthx7|}В%KCDi6?~ .\be¬L "$"C8ad[ole]^Sff0?(-[nNDcƎMMMmp@"}$Z*o&wкrQz9YYY<_z%i e2YRd{GGך7nx嗉yџjVV"j׮ W V)nب^G?e Ë<j+V ONI~7zrppP*b˛}G~~x@ 4L3:Շ&<~wsl }qS(r\xT*r9"FtK1+ӦM i1cTTT,ZnnnAAAF;m^aEo#ҏoܸqGtcƾDGGgdλ7n zwb`.j5Y%K g5Q·ӧSku<==?Q==֜XF9 888g4-̙%_h*G%i1:&&:&ti7=.Z3Tu@;Qqq9woWQV9aFt,B?Z&''GӪO$7ADaiJ"xX9bGF36of~F*D'k9jٜUWkI$dYr8cp/_oMEDd'M/Uy'bXkF9Gƍ_}XZ:aayy"'xx;t4Tm]\gӫ} sޫa<ϩ9aWJKK>|8#ccaav=,p.eb"8-C`]\T؈o~COqҤ숈kִm3jp, \"牐 v? skm8y*WΟnY Sxm[\*9%eUZfff]W߿-hyH8\Tj_CU+{b!;bcyy5\Mq2氳sLtϙh{ޣG:h D9߹kq]tڵÏR4XtYAG|馛'4a∨'<@X>Gc)',;wNEpm[h%:DV.YȎ공c6aYAUij,77"##### %*o&ӫuqL&KLUQQ4flNn*bg@ycY>n%&L=GDDڵk=V  ĝ"p.ǿ:bl== ±#,q'GB`Us!(Or>!dx .@k jg`.Z-vv6Ѡ(Oh% #,/: 6 G9xJ@+!HXrp֩T*Td6&O F 'LhΩX}B Q'D9`}B Q'D9`XǝyZ]WW<0H$bVSQZxh4shrːHd 1jeM]DDꦜ!@cdg/ŸD"FʎSs\uuU1T*T6 Owww**x{+M?IƨU*}||丹}UrjjuuW߿",HnuԩEk,QJUS8ά(/hW*8SNN@aoVZy];wrrv䍔 6;?I&kg>Zel믇>6m~C:xSv G3^kξP}whg'%I$'N>|h=9}OOFN79_LV[+&4* Osg" 9sgvټygHΝ;߆xNyU+J$^3f3}{Mg:@{}#رxwww{v|>z7W+ҥjjҥQz :ujUeЦ{FDus-f=zڰ~=)/իA]mmT^((((((Sl޼ef45}ܺlٲolgϞ낂0u/j>ᵦ)ۛkl_BBB{=ݻw@%ssIKK[hQ@[!C/[FDTZ =᡾oYYY@qLݻWYYy3}MgkJJʂde_fΘrժAAB3TZU]JDUU...:u~l};/tZ"QHe˗2$..$͝=;񩧞ruu}zxxG3? yy<_Rp.|@`aÆ '8ag2,] 47o hNx.0Px={СN>53>14'g'G~ y4g}6!!ATkf|s^). 2$WO?T3gKh G8x… ?䓰0 ;w9{6**tۛS&E0pc͚5B={zkp|,Y{n߾xN2c !䪪zDžzWtЁ^i=.&9y~@Ϟ=p.RQd҄#GСC.]/HV*Zy2?^w**SRJL͘񟋗.թTe7oXG{ɽpAS(6K.M^U#_j7JoXj/1t_c"$%6vz^~AJUT\4sff*~]YS>&|>h϶M۶=vzb:*??ZlРY,vrJٚÆ KIYx[~JHB}xDq/QPPPPP:vϙ;F 殗3,]xG1:77WccctI&oŊ 0`ѢEDa]*W_xy"zF!tڵЬk.Dڌ5//?̿.y{{c?M&lW_x,2r5AA}9NQV,_k.63FYYpP{k SRL֦_C SLI={...1Ǐ3::zyO> 42usq:-eF.eڵ*p3* oǎWLp'H$rv+ N'!rtttrHPPý7;k0?ݻ6mLKwKRT7#e4/.]hA ԭ[޽{m>.]*`E"M0 #Hr||]&!a [|lvPi8D2Ν;:ԳxPΝ?K&N =udOmF,o5,Y^vbXL0D"Ÿl0AC665EQ+D9`? Evvvm(GodI"GD88: c)XBlW ~X{rqU t~٧D˫@-(JD~rDDDΜ?)T\z8 < f)J9^םtW&ݗ4Q`'?ޭ  4??CdlmrDIENDB`knc105/doc/en/ksetting-en.png0000644000175000017500000017025611436653777014310 0ustar dandanPNG  IHDRE pHYs&cu$tEXtDescriptionWindow Class: knutclientVtEXtTitlePreferences ? KNutClientP IDATx]wTE~3.l@CxzPQ=ÙQ P? wX$ H˲,y_uxK)3W]]]]]߮73dXt  JP󔗙|%m[lڗۈߡU $%hD(kEFT~+RVZW%$;6t&”R>,LSJ!'cq.4:d2ޱ栰TZ BQ$B+7(s`x6mMffʌ䤂ߊ%E6<1+ry!0hٍF)u iB)t" 0!xE-~! c2i$5@Sl-CL==wA4bD}CG^QI'J$Dٰ>R-F)s#~uʋ!J))N,zH={I֨1+w4[kQUS#(^ CTAE8IdaYA$ΆÝk#g,@_ FrJ~~H$bJC$i|lх(qv?֭[R]ڵ _tQi^-o-?d͚׿Y~ZrE K=.ڵ"7Mcf.tL1M[Vm Ncv2Wyd] qeiTnڶ"BJ.nh%V4%<"&XUeE(r9*V3yx[1Z(3N@qH1]XLDn>#00;c$l0FaRzBѪ܁:lj~׭`6RB1ɤnQl<gY6mB ,YvN΁vڹz* O/^n;_âMv|hiܸ,$!ݻ tyÆ LHyyhTHpeeMa9;77[ ˍ׶W3z!>\6pt|Pa\G"LZya)Ү}vg"eY6֭]fe]ֵkW;Zn}a6mذ~](L(ӱcN:׳>c JGsJ]EE?=E`DN_4L>X",)- "/,\g1d00%R]^ ZgYӞ?W<d9~˚`Y  >@*RJ!fPw@  OZWʂavY0]\ܩS[ouks&M+ ;' ĈX+GT=PlQ GX>ayɒ=z.fᰜ,=GQz t˦4`eڷk߶][^xne//|yBMjz3!]~g]Үu), | l!R_v~oQ1=z\SyYռETI5JJJ9rӦ}LN:bUVSJg7(*ڕ3GM:tx:t8VRY37'gСFf5WgΜ;o^QѮ!W_}u3UO9diYV6m^z>;sٰaCvvM7?]Em{֬Y۵kgnnC2Qp'YRڳgϑ#GinWm&+'tӹsS ?C&k6lܔm6njۦ5ck!)'tSH6!uqf6_yeΜ9v>|3cl۶3h[<6o*&Yͳ|-G{mfbTTon~ƌ;&F1K,ZUTRKC\K7dZVRp=_ w_(OjIЖY(Q|,@ //n%{Ҟ=O_⧊r&>G;4Ǒa*ibY妰<_7w7t(aa04F9`YQ~~&L2R:j䨗^|ŗ^ʲm'Wy4b҉lm߈7_Ai|ЩRXa-YW-B@J6[^QH G"6&G ُ ᪫.aժ0sǟx{ .SO,`w`~̙3ExO=$|U,1Ϙ9c㓺whq!c9k&T~g_{eyM~Wڵk`ƌ&=ֽ{%?\qON~_ඉ\/`6nb6nZa#3W@~Xe]BM{okϞ=~ZOW]5iҤ鯼7ytUV//wy'`l޼e˖B+lێv$P( TWTWWWWWUUUVVV!oJ_S]]SUhd,T8_(qd BP((x &:+-ΣTaaPBP8,) aLP8K E" P(Cp$DB0%D8H4(Fì.ZF"l-FHԥH$mG"mS@*6EGg19")AZ0\`YN=̨RYɁP8$g-bB5j۶mE2㕨Ѩ}.EQ;J,"jMia^x}}zϘ>}W²Xuvxr5tMN:f />x(ш%bGA].iFeOWy])@(NO >vkQ]]8P m;FUU ߿\~˄ l͛cƎKII6|(V>v܍)))ܹ[nIKKc[cǎK F :Ƙ 7OHKKп?l߾zݛu}vǍ1%1,BJJJzҴi8{ީcބc4XQW+!) rJlNmx@H < x$Bb҉,^qZ敤r6S R -9ڶ=eʔ$;'FѨ #a|\j۶#IJ$?M?gΜa/4mK:1''Gh4nT"4a_6o{ꩧ@E蠛o fnA 0#Hl#9/^ܻwA۔({u#DswSuځ3'C`RRH̜9+ɟdGp8 9)9w;5dņ ^vwu7 %6j| \0PTܵsIB8ǜNabĔ62sI& hn.*f/(/<󄨝;v[rON7n,;!pqo֭Eax>r-~;OTϷ<>co( ʲߟ ( +pqG4mJ~H8zPZqϪ:Q*NnXq:@>?#4S4J!<-vܣ/"R,7PJ""*`[ uJYcQϘZ9BVT>nnv~H뗏J؊u-"R!,@),Qp]Xu: {qk?! @Edm ,c0ܿ޽%>hVl%X0LJasRSLNJFP>/Z\XXx $Q|䰼kΗ_&*6¶= sss xWfINNf_yŋ}v ̜9װ0eI #I`MOa>uudהҬlBHeeEFfj?jK'jPg33\|hZrs*Q 4it_MNN;`| ''GZr"hp w]lʠTRjڹ -b4߾m۷~4tm!\{׮]h''O~<X؈>lذ 3 nc.2ӽ{>}N'^ˉFLbqKЧow~{W\q(_X-.5X]JHS:)~<;<8NJd^zIYD\sKR,kBQO@ *-.ΈNTaȇ^j6f"v"魔kl},|{K 6p쬨BA f x!D糀L>}-rՠAs~)ٶY(޺3vLÏ?E~1#H80a'lܴH(+ڵi~̌0zQuu%e(>t`'pqN36VP- H$ E#.#H4jLN4qh4x1މ(?*}əQRj tQŪWlkAڶ #;?~|ueX0̈F"TDرO~xETw 0,%;!0nfi VڢDޱm'tW^iG"C:f̘^|xn;=D"F0%?Ao5K.l2eb p8337((hPJ4 W8̌̚·2&juԔy'tkGaÇ'\nݮZApÆΝ۷oݺ];rV!:thJ 09g@VVMo"G^޽NNN֭۵׎dӟ4Ǘ-[Fڭ۝wIPBa̙߯3njЃB$dΝ?O>Dc=78Vns^io,M$RN;;Dl)!+n]c>*d:h +!&Lm\t6 32X0ll@iIIQ7W xAFfP0H8!JDmNz^l!H$CB",gddkjDp+Mk IDAT0ϏE-G6}wrssCʪ^IϨ=\اC~w"(C*W `xƇ%%g7 y}]irrr %eIa³{'^ÒNv)'G#=N[Ϻp➐qs9݈|V٦2kO~l^ȝu.aR8nen`i 9̠ 1S ҪhE[Wm}U8?b>2L`ϤCq˜A8JQjX} 6$- (s vP9"H`cDݨ|~;D ,nd5Pנ`-fdJGCBɅ/),S:4o"Hf )U}o׶!dO*-<@Z6\$J ل IPs< R#\ UqﰶTT蕇 N=ON\OӴb֪ bNhȒ6zu.ėF2_̕귚7J:!;L ̰WՕ52+j/ƺ&*8R+Auu4PSL!&Ɔ=z0fc:k%*ֵmSaWԶh44KnO;tؼE@ @J5(,+hP(4oC5JD$lI&͹&`7f)vPil:bR#:ҡapeJJ~y5S(ض,4sUlB,/ %{jߠA@d7|yF;j7HONNJnݦu^gdeeCjlBХEMc:Ϊטk1K-'sxO )4h#qݣvA_:Ľ[ت@-98"ivC`R]V4Z2c#]`R2YXng4^Z_@ÊKTS UwAq6JyXF-j8./==՝q8d:j Hm9n֠ARBxDEZIݠAZTUU !",J1@FhL *+4pWϖ3aPk9T7%%%AJh$Z]S]]]|>?[6Y IDz2T၃Ⱥ!6p5Ìf:\>`nl?03 ZH*q_~`IoMOM_ hxhk\>KL6U\$& ƅ^ L=1/NŁjrrrjZmG`HB&$"vi @uUxF߈g0Ar 38<#4h`{`DEEE$~L3}W=ǣzA a@JJ 99##3##' H4#| @Z!ώ D!ضk}rq@gaRP*!Tf#KȮ,-m6k 1)LW"FP4V}llȩ"wxVE@~u$:0nݟV^LSI3KWa?,e3O7lo O%D:H?m7膕`6k*9hH&X(pRp*y928Y/!I@ 9993a& H0 Bpx}@ 9l"j$y|6KaU+"r$fph\!5h0|ρo DBAFyj/ҡ LfE) TW{`uFUjǖɦTw]!$SjWZ"Jg%ObE  U% 9ZtSEJώ6.h()pk&tMD-1QtGS*mw\d<k)^D5xEPv)Vp# <4T6[C)0VM/a r<]Z81LH>#[*v!EQ͙X8lxu#JFHhjM`+J[R4.B}\c}`/8%-_ȰgY FP.6'&BgI|Lb`bΰB.scW r!Oa7geh}:Fx:'ET$1a|/>q J1O"&;4+CO{( tO*<DDHaS~R4^;!DiGgAcY~? 2B-\WOTsß7Kd(yg*) )  sp=E}tF @rr@o?v@nZ3N-Lh V򥮄bnEŷBƜnOyأ4fT!1Pō"9Rܾޮ҄${w&/cqf]pG_Q81ZDi^l\Y!h}Y"n #( x!8)O re :lyj`?s$ཻ8_El8v_w̎؅IaZ̘m*v!N4W[yC٦P/pbA'^feCۦ0oWzNN\V @&zr+Q%jbr%h+LYRU2hOIm]_qxÌ@^Pw04[DakFh5qP_3g4~)R2Xh})Q%մ^!0bZ`.J[20朎yL!$ ÀBI2)c3c, P+E&2wk zs1>: xH*#Π/iu .p8)͈sG㌢|}'e5'_*W@!ql<:so'H@^ 6\qP\0&02=Øh$u0vf0b t0Fp!6ly&H-r%l4MKdn!M3_iTCN75<Aw݄, y|t +&ZnrgpL{ CᦼDq1'1f D0]0v#NJBSbA +vW7z]# /~/$ӕ\MyJRԒͱ@|SېlXࡃTrĉJoXRjY8f-Q $(#AWCqJsW=ڑ<yo Y-q-]H] ZX7[ fxw4NȁCհ(ly:xfFoa~UV+9aD·0xt6:(u%!ׂDl@'8d_~{"l6bv\`(O2zFkC;7GA? T,,^vwgA8I,e p2)'bC"F`Ck; DQ$yq`1Fފ#1`L|Ɣ8tJTTG>I1M5EȣcV似Ьx\āmQhOiPܾ0$bR+G+luim+N4BNuA>O-NthpgZ8k^rwtob3R҆fQ@jY LV {4dO#s 76Ħ0vءcc$ ɔʬxxՁH$ 9q NlKӓ)@Zo΍tkq~NL\ U QQl@糁ԃ Jj%TbpO)"Iu{v:0peǗ8{^sV3qVq\W\td4,V*DLj[J3x`D[ ߿eZjuش24hSk! Hw򊊥˖u5++ Cm9<=_oI_"ťP-X okVK·r'JTj&*JOd\}LnXnƄ.W1Sz6)DGDǍvkf3N#Ô?Y•+F<<0NQlÆ Zӧϡ|qnݺQX(6B@M;"uS1*oi,OQ#dꯢG(-zj˱F/Ĥ΀Mw2`ImUܺAYnJH@H-Q9nb!Ro )R!@I䖼GD"Fcnr#̃ǜ*/Q5 o9n0f j{j{9~Ieee<&N}:vC osQoWgG"V)@2)_ՐdUll &c#F3v T[Gm^Bh ?{e)Es3,)fת`aʯ)G*2D3+!I% o^(%@Qf0(D(.47|ap#3L׶S`t p) =mtp-c&{TAZZjjP带Xp'u=1|*#C3)D wG5NEKxty \uw'J HYDh +S?.U?oPUgB]8a.z.a+' b"nvH{<Ѓp= pﶡز?Fb0dxtq}6 4g Pܳ.9 mSD+Sێk:vo)# 9;Ws-HB\ 5@pbop 3N^Dpgb3?#+?$8߭/Ps^XU >hyˀS^QR:J!2iJ(s-5@]g"c}Ȣqq$7crF{$DHVVK5HהMљqL3KQ]'4MK>(IXl8ƺn+3$<9=]x,\p劕-ZjҥKukWZU+)ge?l~uUH/dr'nyamSO ?W<$]qWS̉ X+VJ˜-嶬hZѸZpԅ}\^n²,K,'I,S'Eae6L"SAt]0+.ӨQVΝ꫄;8Tx֮]?|qȾZ8ewaV-^ i e4ӷȑ#3Vp dG%%%룋-NOOo[o*i0H`(ܩ#āU (.6d:m}*~Hz=k%2TژZ晶,_Q{%Tp @fubB <MN[9GlJ-˪b](**ZÏ7o޷d67IIJ*]бg}={mb1'x )kMIG 7o* IDATW4:B'iR۶0 0t鲲/>I}٧sE6r8,!O@PS>{g_Q˗uQG eX44b2JO0} ѡK*BoӔbn#nc#:6鹗VeBh0Hf;vGoDB~Nm/w55-WС!oXdz~5k,6]C;KTR:|M **3?P|QISt0Cffe_^]Sc?1s;oU\\w9rcUケmܸ1+q㮸J!yΝ#G^k׮oXЂ]3,u{_ EcNII:tx)/9gEErrs Ku@ о}<+>qg 4'vkݥ׀ѮCug(n႔KqqW_g3fxvw}y=ԙf17{4i_֭s{׍k׮['Na]~/|b6lxXK/;o_q-2d@i ⏗w߽oݻ0'&?ѭ{o_x?3~P| vu7St63D\[:3Pk辕ʕr截[ ũk+SGlp+ƻY` 5jԨcGg_3rؑ?|uu<%1(/#"Lm ~#)8ssJi]֝Wp™' 5,طoo#5#wvNuםYw!۾cc#> Lߔֿ_?ؾc;+ FNII=:#Lx0''g|#?b#V jݓХ"INOcM7ZwJNNn޼ ))yw@h#c}v>]U@,ҪI'&_\ZhyT>tXo>foYY]T把rrr.Åzq^Tl]2's}Y%K~xo̔g.rBH4ڹS,_ 7iI~?xDazWS=^ j :2Ĺ6jOEcC1ƶ]s9\l1E:{G7:#RqKh_kcѣDCE#g=렚퇔HYqAE%6`&j Ѫ:%/-͛7|7cęfg~ }e%,XRJKKKql4ivکz'8p-8u`q%//RJKJJ]}u~ 7̘1ijL/| t2c18>wVǶmG}`޽rJ (@ N( "2y0bK]Py L ۶ՄJۘDi1GQ 8JZq˫i} ƨyqz룚L)7'qg'tXVYNls7@ z5 u.9;4[ɷ@򱛉VTTSNiѢƳ‹.̞ ^}UJ`ҤKݿOyջw~dŊn[;ҏA]t6gN(1s(FB+VgЫO?U^^^YYoƍHO|oŘ90K0>c3lq lN4Xp7cw)fszə/ ,ymb! ZA3I!~tHxm֟-KJJD"?wv~p`, v-Fԃȕ}:wjʶjuֵiӦeV\:3_Vo'jUՄ *_Y?Ȁٖ͛7mT룘GYUYYyYgwz-jzCn1J4"H=sw}2x:C.?6(sL WtQ+Avgf7b߱cGÔкur>oTk|_Dm\%|qd%z@ַ08bU StR+{2~ݘip[D&1x|,g116x_~4ƪGhVlgS':Q<8dKe#Γ:r$H.7^l芡$It vUUYYVVN^vo޴qZnנyOZy$5:8H`2JA.]ݻw7nw5׌?^34FN}])KoDQ޵kkhwƍS;ʫ |Č11Tu(5yyGуS\ŗ E%b571n%谑j={̜>c c;k#?n!###vzq%f{&8j]] wo eeճ>\曯֪/<=>H_\r%\,*r%Lۛ OBK.K.ѻG|¯zŃze{uMbl*0s5jvA.v8Ʃp<:o~ /]eV1'y4QJBRjFf/9G ݛRz[oN>Oxh'FpM<eXCx&{kֽʌkP*)v9h},6A,E‘?xݩV4x~ųhԞᗟ|4'-\?5#P[Tۦ?m>pv mo9trƈ}  `cW[^ZO$:;qKzf<GPHկ KE\r9{e7 ]<{w?_bܶu9XYYyPkA{,X"ikSAx* XF1Ϯ333{(@Xu$#9c9?K6Ϊ:LHt庽fş(\3A"?-!0JԨzcFԔԲ 6DI2˲rrsRSS&ųOkCC}{fg{{kKIO&ԦKs}ex/K;k%Q̠Wrv=/]t<pLInڠ!%(A JPafqģKﯿo_w? V#AJM+Cᚊ߽cȿ"A JPc7?{n|nRRǟtƇ,5[wU݋~S˖GX%(A Jѧc7?#eVNioA^[qKExUlf%(A JЯkGEN?ߘ%(AE:vG@G[%(A J':) K} JP or1ז%(A JP~Tߧ7E&(A JP4%%(A JЯx%(A 5Я rsrs JP@Gv}͈[l8}U JP : x6a} /mW˖'*{J){%(A JP#: xХKi6٣G]N;u)g"9^bfM>o BMxBH74~ΜEEEs?^6nzGyu L/1Cn޲uk׮[XO̙3{[mO/%(AG=yyyom've믳[3fnsjj1c`wA`˖ͬ|nyBjj %(A J1B~ [{%K ym޼GzPصs'޳`޾mIII:e7G(h4%蘢$G ?+383_i[zIK@`MM(Xs; JPP&XSC.6A:up;o򗣭Q%7g}t !<ӽ{֭B x^z @iǎ):uرݻwƌ¯r&M:w38c֬/bժU 9𛯿Ktryۺf7|ҥb͚c(v7m޽SNŻҍ7^p@}VcǎF{fӧVJhՒ%03 |뭷Ņv ?,O>?/j~뛯N <Ӻ)Sٽ>w:YXr%{eN}~ɻעEc^x~>h7Wnj{}>L4 wsM.^4WIًaqakwߝ{|ӧp1|III_}=/^Էo_-̩S-(OQ0A)JYT1běoR?/bw}wvvvvvww{i& 4mO?T999sG}[? =۴ǏKϝ7~9gDJ PdoG}7i855uȑk֬X} _ 6/%}zQ2ά쬬 ۦ%(A[tO?.^saE^k؊/SO;ׯTwoi&L%{*gOI fꫳ/N:鷦/>Y!U H$aa]v*/m|7͛bח(3##Y/ܝSPlϟ~b"B- ?ڰaVyr藖$%%ws[K2dUCaÞ>+//oժUՖ3bV*2V}#_-o͟}XhbO?ջO?XC^ ? ?Tj,ˉ'6oꫯ;222$$m۶m۶ڵk-""@NWU(*tcl℉))]vuti< _Yfr_ܱSI_ҵ TŢΙ :tС:vٮ?zY*tp ܪʙ>mZDd~Aet:Ν;۷;0`Μ9]v]nj~w.o߾W^Ыg/зlYrbSO 92&r/zl9׷yBR(ep$~ fφg̃ίOQTBBB^,f3.N4ݷ75%u޼yܯm۵85ޘ6Þ1X,H͛?ڪgKy7I{+;K[7&,nMb+2vc)۪>(,*^fn ~ij'X`F!T/ڵkG…=]ZpPgY9s}m۶uux @9>STl` tF̟7HBynom%lN wl7탄B!*%:{O ss˯7Qy)pD!N4GLi6{2!P#g,@wΎ۹wfI$#DGCP" BƳv8>< ~3`)Bٻi#BE1`@nsp0 0v D"Iռ̀BFϪjQ2ؼ !(3B^*7Lji"}| P((h4fTZ!3!D5xVU L|]xpJf/LfsHhX,٬eY bqpf%-5U.=ڒw!Ԅ8b_g08U'` (orhEVe/..P)M6U"D4o~][i!䄿 bX}F';ǃ;`Ǘ$&r0pnZZ)]%Ӣ^(,,Kv.]E!]<;w\59Kv1iO穻,\Ocl]ճ6*}cbIJ$b,RXVLViW@A~_ nϞpվB n>/gj jZPxP.{eK $ˊ)eM&FZWbZ-d2.'}cw~.m)j͚O{w^8ޑDZS_}O?աC44aÆ~ue~|X_ BYrrrKwZmDD PȚ Fooo^]8NFa\YcZK߶mw/YYYPڞzU7^w+W~c޽'NJ$__B/^Xf͛7b![/?n oG5˲$ .f̰ Aלd111￿O?}WӪ͏:}s5wBuwĉ5<#n۷[n b2uTz2l MlՍ3ͬG%Vuggg??eYa ![%񌻅zv4n8Xܐ*+MSʥpM8"@(U/" =#S ڟ#Fx 5D//DGVZܹbdgg/_F8z%))Eݽ{w~GBՁ2 I'3 +%Xzb91ݿ'@Gg;Q-+QmH@TfdfQv{UDdTAXU-7M_Q^`Yv7 &drdɻ:nIGe™8y2S^{-;;;""bʔ(/~]5bԪc5qV{ݻw#"""[xtQ;М0-| u;O=uDXX&Oz4ܿw/11˯>}zM抯%P1&?%E˗.W&@,e3g6o޼5.Ⱦ=v_7D/T9\xtXhѥ%3$ßh +#D(h5ןGnJ,24@j߸h.rBnkvԩSN<[ Y)ܹӮr,8(HNLwNJ%533#;'W"7 eСCJ?ʕ+5j8&$IJ% JEnNNaaQֵk4E \h~~rY[3~!BPHR?__l&ID"d2 ?CJa<#@T* cF+$mer1rާvjZnZj9gl[kYYYǽӶl?6kB#xܡM7~o[\ٳ~mw?p0,CB5=8H$9s>3ri%:tعKO!PCiʽ㝝ɾ ֽO TjalcVb !$LL8"!иn߲e3 X|♋7ೊ9{ԙ{27׈z #boBe4@~~>ˌxVzP(ѣg=Ǽr5߳s2n/Xc[Դ iY|=ƄH>xE՗B y`5k׮_|G ݡCzf]pbcwmDV}+IIm&i|n˔kƄ%m_Qx+ӞUH{!#IPCi<UzFVzYHͲ_I~JJVlVU=٢})$0u%[6n|f7n+@!_}1s枩Wh@;jiԩ_}i-N]Cg Sa`O6hr̙y㏞,jP%eY7Dulcr ԃ\wkʭKWr7߼rKYO>ȥr V_mǎSߘ6b///X!&f!7n?n,3\zL6thΝ_۷W_ 4cL Ι=WϞ]t>}z^^^C|k!^,<[t3[j%?kJn\ze:PB[LK>f={=~D,ٰ#J>sSN evڞ=^t XvYcǎ~xxx5k.]Y5p 7ou3wh,V [<_e_@XYJi˓P(O1,EvlEE>*o.1c xeС[`Μ_os^77O>Nwe;p (KfϜ=tذ2"k%tbWaR>BD[J#ul5($Ltho-s2w9/=)Jf Hi5[:zs5LDo-DBsB`Xa,òlFQ { 㷯g;{ʼn9IWȄbU+55$:Da޹s>ABÒdmx֠X%x"T-Ur2>wEv'@n&XDNEVZh|k!O, 0{vx0 wep鎟p_.,,du]ߚaY$IpBG QKۅX"3mTZU$WBM $YW3Xuqͅ+Ϯ{ߤ|S͂Y}Vbj*XxfYV"fb1bX(gee.]TZɋ'Az?vStk૨b; !"WSg6l6l6p1F144411Q"z^A,X,"Iaц!TaY=?$IJRl2j,{yyIPLV\\\U ݽM{I @EȺ! иv*B9 & rD"i aB!0V5$$i__ߪJhӺ͒kK~Ex|UfsBIu7:WX@d={BOoD@ j_4B!y N_bXx}axfBsZwyF駛7onݺu޽c@ ZVFr*#(O6bqN!}||D"љ3gRSS. !qbfj[VR΍u(J"())'P(aaaݻwBѬY3\XXkB!3z%'L&cYnD"BJӴH$ ͚5H$bXRs%ݻw/55a """ꭲeBMg$ EI$JEӴVeۛz>N:eeeÇs'6XBy n>v#G,**H$rB=&Ϝ;rVH<"xdɒ% 3s]vJ${޽];wDGpԩu%%%j_^(Y6;/0xEo/Gwb*=EzUDoysޛv2L Y"z4e{Xݭ~8^>([bpzL&cu׷\eKn}unϸ5 XիpիWr~I|{s DѺy9묙39rd̙kV2;ӧM?w_|q4mӆ?CFf捛*ULtU]`SX.}ݼiQpۨ_3oooOW!9t`ܹFz_pO.ɞK1 nQD.]b?_|͏hɓ'<+V)v܉ .U_ Yvvs=,r ;qqr}n8Xn;mۦT*,/\yyy5܃j6whUצؠ NnnnPJfkdAjZ4_jzbvm7mȲ3]rCBB --U^b'fdd< kz#//Dǯ_tҔ޽;?.rܿ+|`Ȑ! /////oZUuzŖ+kVaϸyP&nlP6";__*k„ cƌ~4yRN6{n .xj70 7޽GׯzfϞQ?3B/~3x-9%wW_"磯_ܾ}{9\-/w'BA/ʊ+sXb׌F#t/;A`` D"pje@]RSRByYc_<9++ݻ@tH`w''%߼j롦!x_4 *jXͳ>-]RXXX\\|_G8kBx>hk4@S2g}& Dҭ{iqjx\ѯ_3gpr7~ܸ5,B p}BSߟ!B(3 K\#tδBsu g!^yT7˲4MvE"@@NPPG}~x(ժ}|XҟlDhk!PӃwCh`xMM&r""2͛*J(4L BJ+2 &S);%5:]^5BSAxBfeqYVZ]TXM 9@B9g*-WW.aY4V IDATbYu}~RRҺkSSXnX1:SN>bw׭[nWjzb7pkԛJOt.dy? ؿ߹/꼶q3avv;02Y-˖ u#FV;µs.??uCi٫g]ϘW\:lh.G۷%svlLתʤ(j͇kӷϗ_}|JvAt7nۿJ!O|HӴ^ʪ!@jg`ae٭7xTn`PP5 `̘1s~f3Al߾}Ŋ͞5kEkV[m]v{];wyyy}˖-U1\m۷%ܻwr+g|g7gR\>wީ !xc;دG |Z%ׯ(SFE=,[]w#;vL$zDDD8_1gӧNˇ {{ގgzWAYӯ\~Gn2P5r`R(k^U999S Ͽ<,0sq!r$ I٬T*3;E9~D!PXT*7#>/֍C;>=d؏=$:t|Ugee 5kp^^^5*^eRSS(wn܂jkz|} $b~cYH˲EEEv],+JRɝµH7nI1 \ L~uonK$/d1D]d5k N7~_~uw}%K?cN7q_uioL[~݋_dYv׹ '&N0iҤϿbgggGO)- !b np޽OD_F޳gOjf 0yX(&~P(?yARRye/R* Ǐ? * oLJJtXllݿgfr\?-%s *J$IsgFFFK,=""f^z&>Z3VfP(D$I*ȾO>ɍv7n0 ڢE .CNyR+}&BB(P TbD {!T؇#w}NNwLT(}a\ޢeK@ d4M$IpFhѢEjj*˲q"7!o޸竔+lv"Ply#><<5vp9/~!PR6Hvav'Gt'Xm"H% BAӴ@ nݚ-p̝4V~H@@z{UG w5߼}v`J ˕veuu]8B5,G g-[E=3Or&zL(nB@ f.iX,8+r5DŽ WAd2TZ&W!8zZ hQ=m~|*MHDP(w+(itîHT(3.Fzi!T$IF ' *ܾ+5=I0bq<'s$)ɜ{D!.H$ H_m!;(rrrrssi.>sxB >3n8~P``Hd7A}|>+i0GeVlYw- c!x"txFd0C}Cw pǥ8anM`/q8x"B# D'0Kko/X5LVjRd\ii(xB2i5\K R*[ly%Vѭ_3=/B6&cYifYMNבEN}\$9^$GFX¯ϜLB2,y]1:?y $IrkYV.4"HD"g/}EY6Nܫ,,,ΒH$8>Bq~7BoTTk6s.㕂;;֬Y3__|b2qD"fggbO_Gh6۴iCӴdtYPDFy3^R!geG-zyyEl{8,dh믿5͘1c H$JOOS*͚5k@Ӵd63edrNgs9zFO)*..ZDOxKO~ux\gnOMMMJJdMW k֬Y``wPPdIJJQQQJuw ˲f he[RRҺkSSXnX+cLSΜ>1&.!֧vM(Q3RTrM&VMKKYǎcG }VhA\VVL.9k?0r?M;wa=Bҵ>sgi$I򰰰PPn>EQ@"$%%ѱcG___U؇KݬeK E:݈#]s.:u*""qf-[O}z^lVn[xq=kNG~7m8ݻ/X{S!xl[223l¥oټ /ǟ~޷o_ǎH$>Pe:p lĭTOgBym/sp+ȈD"\^TTݶm[///Թn,>+s7_egf:ύW 3( .?v'}|"y~~~~ 8q?8.=n~#wZ`B;gc#Pq|X,n޼'(veKf#""Ri԰p>_1gӧNˇ {{lijy *-///88ssszQ/yIB>>S˗-[7g֐A!FKmVպuxq՞Rl۵kקO_(m!jdeUJg\xS ۷w۶ .4*o5vJG߫.[Atm钥^uB mNjƪ<D^ߋW{ӦO6}ѧz"⩲̭NZdlIȲ,Mv)+%rD5^93ġ(j|||eY *YXX%qf}ݐ/h6iێi:BlC42EZx! 0iTmfNr_5B1 ~jʖ_fj4¢";ujE!0˲f 4/,nX,N=?.~u1ikFpjt0K(7דA.X(Yw9_j\xvׁB ߸ΪzڵS_ĝ;w޴i#NM أgKu믿2thΝ}:wֽnjY3Ba<:MTMR˥7o~{c$Ɇ ݸ.%:{Wƾrر~  puv!T03mڵ&i}[ 33K,X﯐Ξs1)oor߭kWDT*g͜ǹ?Bnx}~qy9ٴZ@A~;w-\`Ν׏5 XeynEr\ƍoIBŻxc'TԩST^;m}|UQڹKӹY ^{) ԧo_7ODƯxc'#ԛZ{9Ǐk߾hݭ[G+,'\cZD"NOO۸ys]T !J%v1p|$FcpphT(AAA&)+++<<֭[[ܹׯ߸qK\f{q-[]~],uyq'Nb箩SçL~ݵ~ V;nܸ#q2B3g#.\hݺuAAA.]bFшt(,,۷o{yy]|933300{Q8}SI I'M-m !!t5@ V UGi&,>|ru(*&lld n߾}yי^2aBxPme-ٳg;~ FyA.CFB5ӈzn)3^fsL: "y_4ι>_nnnC IDATn޼ %?wUm!hBH$xرc^JD߾}yhv""eggF^/u5ߕFbNNշO˲}>!<>7Ν;-[ rs0 3fM2e̘1U.]Z *vWVQVXBQ-Zĥ9:4rKCcL&DDoooX\q}$]D2Oe x6 vz}xxɯqݺuQtգD5q|gxEIt+>rLJKKճ g9R\V~Uʥ$9iI'F~EBN+M:nܸY)$$$Pv; H!oSP7_UBH$6߸v#,sqggg;[rJ;뫯|E ߸aGǃĤ#F\bƍܡk|՗ڔE7j<Ͼv}Zkۿ.\P( II/^-H^39R]vӥR3];C{5kL&={NsB5Fg\ ^ѣGCiC`` D"p;w>juWLh4PFWFF!nYr j<RSSOx}FԩSWɓϝcgSs*nb' rss ;;n,KQ:EU;!+ggYrs=ϲ\H4T*պb򪲍~%ضujݺe 8C۷mX,7n+E_?u'Z=ղUSsQUF!g:9/zСwLk^p['qq ٷom[.\4g\[o|1߂Mƶ4e2U6GTh:u//eB1DZumUy5||6=! w6 6,Գw=yv?˩v*XNA@jBc!Ɛ~Vܝ}Yx捗g=R5lͭ){BU1Q+#2*ݻw;tʒ:{333]mley2Srx$5v7lG \zˋ04.jtyV^̘1=999//oƍzEHM LW\̢˝Յ|TMyݺ'%&N|&@Kg~~[V#d$eJIII򸓧L5= \ ̗X1(_liNvٹg^&~1]۷!FfIӦOޣG-efoM4+{ h߾SoػoN;J@Vul?<+8(*XBb=,4)ὭPpOnn&}{:k{={]ڡ}+Qakze_O… %sgNM{#/GDldcij 㴔䣇&'kg'zbc~do 6qի ϛ;ٙ冄kq\np2l1osΜ9bgg7uʔ+mZg*︖z!J*SkPŠu`yح7"܊z6iLg8έׯx]7o %qbbe_ƺV8J]oJ3,úiDaIϹPv\K}n٠EJR;X+a0n.EtTNN];v >)۠QN]HCBB7oΠffơ8::۷,13]lP31Y f5hTL8ɇ͹x w෈ pٹaÆ]VZ ްqc 8OOϒد_+WWwoٻwU%7ٺ),:M4*ȕE+ h!#F <.nࠡtMӧɓk۵k7jf͚{TȰaÆ錊4#7lhĉ .lPR %ϰ)c*Q؉zt?fs63A-[h٢B4+=zѣk]hF5r1d-*@MjUJ&ѽZ5jC|tLo^_K jaE?lZ!M/L&+'77:*ӳA=0UKd XWU FVNӅBP(tb=z5˿yY(^ .@,hNcǏ ?}a%'p\777F{Aq/໺p\Pٱ$bwcRjub\j 3M(X,{{Y~qa.9 @axl#V=|rsN4'g_،%r#ސi֖mVLp8$"6) lJ%TJJOzpǣi3 ugj58b Ʋ e>WkBΊԤ]4)ɚRl^$T||}}||tS\KNViSa| 㣯!|ATg|>5tw\Cegj}KYq\^2I񬔀*3P qר&M\zB<TAVs> fk(@V3cVJq1&Ia>K>L+}kZQ*JP؉D!1Azfff$`X e @UrzmÆ BoAjaL8VJTkiVչ}|}jU^G|v(_tF/4ݶHḁI(FhqusWUylٲ?ԤiӔ_x1;'1%Y|fma˗-;;&'$&̜1m6-[2uT*EMjV7Bj:,,,( M9|[ppӦM233tJԑRSLiѲ%iͮ'ѣEC }2ֈڙ6k !$Zu֝:u:p@6PU Rt0 rhͦ@YZ[f-$B fbrX:Ϙ1s!/GD\ܴi*l=x@ڷoߋ9fnݪ,:<ܩө>O[k䃇sVXiTL߿ڱcGNnٳg FƈTI,R: m~!.EKZ3cqZJÇR5GG=~?yw]SƖR ,]vΞ=Jllr07Mb_ anݼyVLԳIf:őwnݼ~ՆܽyK\(iu%ˏq|ӦͿ !ӭ[ccce2BFRS$}Q~+Wt3gQ"rr5qH[[[j1U)B(##ŕZwuu5f$o, +j71JiĠIՆm޻k{.gggb!!!6lpuqc:{|n߹-8ؔM7>9BÇ%*%?+gQ::=MDIZ`g"1Ovդ3.w߁"(i\.?}ff٬+WjA\\\2!!AV~zza0a۶u Vt#BC#S* K--rЩsܼ͛36mP5PĔdnF Quw1{J%8h(FY\F1ڵk/]J\hѦM̙q2,$dذ<>b8:@L81--sц2 Yvm&k?ny˻wo]cߐ:L0qUݺuxCsnT k"'4oxyzN@AauΌ?6)5.HmR3M<ӫvҙҊg>1ºq_IJݻ:deer]M۶2L5~7hc2l͛_}UJ|Ą)SK޽:m\r<8@ vylѕc>b *VD,ͦm>⢏1ӈ޼^J.Z5jC &ߛtQ3NnnGo^lܼi1JrUo`*Vf-g$Ni3+(!EG=w(4|LVNnnԳ(OEG5mLQ߷hڬF5k̇`O!mn„ e;K'{ʊھ]4绲f:.  ׫Y˸똘/^BaŔj2DdJ1x[^PAKiyhnꌎ~Lip\77WFxbb/pqpܲ1cgҝZ:Rh4Pbeƅp80E_^X Ap\S> h)=Uf`|W3N@*/s{!mgxPX4g'@aUdj;ٱGrM{?CD %%kokæe3Cy3O|Ȓ-*2 "P?cRL6&uk!@lEg?(TO϶6gc}_7g=Ң5BHW_nR(v|QL}my !f~cZԚX/L&N0H e7F܉mmBF?(=Ɉ[ؓ?"z5޻&1LQboC_Ys;G?pqHɈ}I?DJt>hBDѾF36^Nu>*{ P+jT*Rj'C)>X̊3>@bmtj3G:XP'g"]}"vH橲e74vue#? h:-_&#g#{!SKR:3Zc:um6yyyyye2|Zu~Vg PlY3!SS)6t4O1|TR).'>!()S_ymGF=@wd+pJT Yo~NNZd *.'vqMdggg*5p .⅛m#HmJ!;cde ?]i*X,mBmi70))ԹwՅn{l{"~;M-5™$J9+r'Gl5iHЧmJE͆Et''XĢB=ˤv|$EMl$l6mRׅ3 Q4"؎]lj Bj&l報fxI2_.W(ƻ66mؐ#Pr/͚QK۶m'OO͝7}-[;歛 ז+f$W^`d: 5eM?r?{_iPtxW2tMYB.mB[ m_O-cƢ~Eru^/$M oPM{hvAJ;?60S*?wNJJ2ǝA˖dg{eyvvvcnjB(**j[XF5nܤq&(Q(֯@ufX,PbbƍuɓRwIϘ9c.zyznڴJ߱cg$wߋl)X?TŊ2-%CɚLNƆu-̖z~֣gϘ˗S֮˓;mvOII1EKg͞%̞}*XfMl>?Iw## /h52|NRUn8C#t;bM6Y,s6<^[ch$Ih+jZ B`={5X"QnߧOn ^?Le!qsuĎg&M"L)ꋅǢ)T$ACx?`0T*51lcqv/rrޱK?OtuBBq񞞞f\|F6B[۱vAN(1)! Q͛6}z˖-mllڷoO;k䩾MPQJf0gf} 'N@pŸ7o7/iСT W^ݣgOj|;!l D5ҷ(߼kaUgq_$?$'7lxVШ E=}`oóid|}i"thЁw#͵T 1&6e ij2F,tP :W /z^8;9 zL`Ig I5tCqqu%hDLL#bg؅%ecYYB=$wv"D'[p8|C@eGS=ZYBHL"CC 9bT {eTv0&1X 0I/0 *Ƙ$A y|j}Ӫ|*A`c Ia&1VJҸɴ|"0gJR"qID`0Pe pZΓ5nRd<|ᅬxt:l, bͭUCRd *.>ֶ  T[ J&Y$'GGR6eQ(NNN9$IZh9ijhRҰ:+dHJ%&1iÆ!J%C<o[`028hT:d.;yԲ4 (}V!. _gΜjΝu!0p%yyzëTݻwS: f\][kd Śk;uܩsk) tҥGϞn>xP={Umz3ũӧ. `Ĉ^2K:>r{VR* 4'%%Ν;/cǀfΞ%f1OClll>}8BH.X"00Gпu>}nxPJU ;%#j˗-;; > *V=zK۶m:b޽gϜaw(z{޽}?OMM+i.TC[/NOK?~ԔݻwkfJN>=~ܸ%?-H%N?nP#95H?޹c ڵkvZ*Qc^/'v It=T9sxٳgWz[;gΚ=k v5c:3m蘘}{޺yx Ȼw)<~ā>zh+]Ch$1V(\'W77f@Ba32,xyT♳gg̘&Nxڵ^pӦɣ7".GL>M$fNqfQ9NΝGIǽ{g$GbYNNNg!/_Li"Hd7}˗~Il6O?1!tuoXM+Nbg'M:E;G*آBo/EDL+3ctԷ hD?#R>i#<:ꉍ ɓ"lWJx~Vvh4$iW՚+W߿޽66iӦoJKK$w… ETJI$.Pb2YjHz+6 .]]\ V\]32 4G={m玗/g y]jR$X\0 GGGSfEH$\ %m uF[1Q&M,G޹uUKp-q$=>+;4 Ժwݵkל;{vk׮N?~7nܾuKoG}RRN"Nϗ˩,M\tD$ {q5,L_Cr}L?.^ܿo?Ou楋5TkBh[XJ$|lBCE3SA>|+co-}1Fm v?޹?OܖZwD4k׮KLLTyxɒ:vyԴ-[  լY#G򴴴uk"52[~"fJdIgvz!tkhf43SuN;Rrb٬֮rvvڶmٳg:Deeffefn5P "DD*-ze%/Dc,Ig8\NmoEyijc1kי믾*oCR'..n??v )#T*ջw:ud*ߏ?]&p^el>زukNND" kk%*N5A^ZC\܊g2_d@N`n.VmZ[ؓ%@}1̜Ϟ<e 30PVitPuy__5˿qrt ,x@1p8WWWF4.󝝝\bS63F &i/Qp8lgA\. ( `* 3* @<0bd2tUB<xT*JvJ!H3 ? bPy2YM*LWU PPǏlx< 'x@1VRej*.>U0f|r=JCyXŒS $!I2;;QT,X( ''$-9W}V܍s箸8ggÇ۶m[j[}떵r6|!IR.W($Y܍`$BJJ.'IF3zlժՋ.lԸqjj>)0 h@i` ˎC8q7͛3Lww P bڵ:wԹڵ ΁[ӷO6mL9Ŀukq6miRT*ݻtߋ5o0bW_騍. _gΜGw=00pUJe椤ĹsuоٳL#iݧ@+VÚ8HPJU ;ưbZI>+;=?o^_~ٝ~4#|ŊݻwO4D蘘}{ىLy֭b{{qyܽ{kǏw!~kW[rŜٳ[eHѣG}B+Wܽ{OD͙3wƌ˖-U*ݳ5tŋ GqƯ;Mݻ{qk%V󋢷Ȼw)<~Fxzݰ%x,YRJaRIF N@xVv ¢#DvӧO:UJ5"0uʔp-[BӦN-VYB!Bh!a32,Xo,GM><})SP~ '߈y'O+_1ERSJB6tE6LMM=p B[~޲`-?X@Q8k׮7o7o>3[ے%?9c6fI"nکcG*Q.Xl6C]7!m۶)SBBBAAAaΥ0dլY#G-ŖcPU/>?VJF(x~V7omGǏq󦁃"wh?nX(P9*l#cGl!ڴm`DZH_a!!믾*oC=ǎ!JݻAe2 &d9W\2oVvW}TYl:jHRֶ+z@I!@i` Peqsq4xB.oӺžL ht7=WWπR`~fP0pۊJA<.Olx<'`]LVgOxxxXUOgN ¬xըQUW11NB@p\]] -***2RHQ0>"s8 UA<h4@ `2"5c X cccp,lD0 \.Á!u!HFQxpNj]V@bŪN㙽L&{mWD$Id26˥3.F~h[UJX,VybNLbl[*gT Ug@UP`b{!`>ˆFpaiAԱa#%H`҄JBԱk# :ԑXknh.4>ƘDXBk(whH#56Q :"PO+Z˶B]cT,  45QpQ ߕ# L `QЧwD`P)" hAHk!*/!\`%J `u~aL\AZꐖMj]cL!ʿ@g4.,,UBDAeZ}nJFOӴܪ)r?Qja@hN<+ȏXG|EO >AzL?dHh~CY'qA=bEԷ^ڇjPh|6G7v;4wֽ֑)Z>cZ2˃u+zlzia(O}͛Ɯxf3* @<3*`gcZT*hMEdtSWUX = 2cp1 + 3JR"y*,R$1=0A*ka'CTs !caa1j:O&kԸZP||}Ȇǣze) SUsL (TJg%sȗ]XXirss{PU2X)^L&rk!ĖҧXJr=)BYYY/w S+#x0D9RM:*%*ab:V%g$Ifg89:dy_9W9p=kɔ 3ψRprr4z!۰a#cF-PR44kf#= ŒsBa+SJQddX8 $|ɴQ,_XRi|RI6ϕ-F?nvjk0L&X BE"*OeV͚^6p!J%$+BcҀfM!lΝ;b 3`1IfcFHJI;s|3_AFH$w!be`QI?|bQF.:b r<e< 4RDYRiXP`jb__;G dNZY>%!6o:U^6vBGw'Z5k l3|i'i:FiеN2Z5kz׭ߪմSDݚko+L< $%>! qy^]׫ܵ뵫k~ׯ^u;e]Rom6h}P,ǸpǠAlm$?[0s F nzuk/;uY3Ík~j=׫!K-Ri4;5ל;8!4.u{&11h+جˠ5L.#D{ql܋IϿOݦʴW#GJ;wh@C=7oui<9kݲ襴KL !Dj:1Ec3ld/uculb2 z zaZڸaC}}|O17WGvZe~S%\ɾ¿Esizc&q)$diӶ@Z0uj׮]}|6hSѣ3224&BծUK~ڵnkGqw%$`So~=ۼܥiRS҇N9@␒**ٹs֬Y-[4g1Y-[49c/;wjW\3g;|} ݗw,޻7f;OBŸ'Oӧw>N> 237o.- E5T8%<'[:W՞8`7fc?&WR:=\Ͻk~hݺ5ɬ^kt#uG_^=hjժ͛7md=p9JҰ6mAa4ڹǙf]f2t ܹ3**w##luB?{kӷlbV9=l={xt Me9LvUm+Վ9ehչs燏@˗ؗ/c_?~ݹ{FWҫ}ۨ.IDAT#ܹSN}o?~ĺ a;t!WdK7fHL[ߤe[[^jJ'O~оf]=ǎ[v}j֪UWF+{~{å6//d5pbyF*xЁ W(.]ԳW^z]xQP mm;FD޻goo_2?y3nQ"_H}zrs46֐Gk׮h?~:v?R[CC_zu+!9ɥҰ t:ME\ːF4{x; ))$ŤӍԮhr?~E\bٳ/^{#… E"{h…gΜ1lyT3^BUZ*5طJR ~gI?֦݊.';T`|ܹ͛Y,?k[7o]r^*psu]b5= ´,?>995j)•&֫eHCvVPٴ 1ТEVXaUo+a|߃S&d׭}1aGj.QiB"{oǎO8W`Jz깈.bߗh~001rѣG 򥈞zC޾U2鲌WG; s%QwYI%޿zϝsk#uŒŋ\gϟ?<}DS*R4 !4)C[.G^}.qXAIm/bc7֩C t !1&IQ•tSl63A$*_i$Q^w qTm؎b>WG}=QݐBtT*MG7l\C-WFgS۶}ŕ™xYZ?YKdTRv+&z4Jh+ʲ/"3+Ks!-_6c={֬YDM3EGӷ4$%zo#VO:չkjP:FãKEދ`~CT?~,D4yՔILi}J>vܸɹ];R & NDbJU0=--C'S*%#XRiX0&#B4d*Ϧٳw\r9$BBH4.BNNNGz$ WWJJLtpp0f]j0 9 dYs3Ǧ~-|=דn7iG |BY/j_piƦ{`ismӦ cӦM] #_&p8!4Sرc| ޺ ƴlьҟBkkC FD+6c\O]ڷokW6nPsȀt۽{wzLSKtO3̾ϳf]ԸW|M%[?PCFdddܹsƍ?Ja0p`!4jUV5lؐbP k:SzFcFq;mѯ߻{tcF C6lt^z+ l1!''シR)JF{B)LHdeS3Y6\f0y~.Z8}Rz匙3uBWH%dժݻw7`ky@+2Tt>nW­F}/oz^1zՕפ~rZt݈$v۶N{=,6a'$&,ZXN:{',i <;P([3gzzKFV[ѓ!L64۫dk|ֽ}uĂzP]#&} 1XXR)uMĠ&R޽{!cLR]u쿷 a( !DaB07U&bs^UtycLiۖN\ɮ"/W)e'ޱ1@.[RS+8= W ͛غii+^A:L9Yz뇃tWC)FxxxYgsS:2%JdCϡ1lL{:I%2d(Z?STU4̫4fۅ_d FT#Ǭ IVǟ7j+k7/)f`r?>{CgRKP o޸Iwhn>1^1L`rz0?Xlsd+N 21J89 -1bW) &xk??C>-=ǫFfY͛'Gjժx#x0D= b:fW3sI))iii%B󝜜\b>okUO\A:CLJ 4M 0L{(?? cccpv) Qy1t rUrHŊUUX = cp1 + ^ <6Uڥ3p%S * @<3* @<3* d2jPYdO>UH-r4`0!AWdIPbd2áɳ @i_ ̌ld^BLq56BPX~~>V)BDБ$2+;C/ok |b&H79o#M #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include KNutDock::KNutDock(KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutUpsData* upsRecords, QWidget* ) : KSystemTrayIcon (NULL) { QString valueName; m_settingData = settingData; m_upsRecords = upsRecords; m_activeUpsInfo = activeUpsInfo; //saves backgroundcolor of kicker //+++++++ bude potreba zjistit tuto hodnotu odjinut KColorScheme sysTrayColorScheme(QPalette::Active,KColorScheme::View); m_backgroundGlobalBrush = sysTrayColorScheme.background(KColorScheme::NormalBackground); m_textBrush = sysTrayColorScheme.foreground(KColorScheme::NormalText); m_textColor = m_textBrush.color(); //m_textBrush.setColor(); m_typeOfIcon = m_settingData->typeOfKIcon; if (!m_settingData->customKIconColor) { m_backgroundBrush = m_backgroundGlobalBrush; } else { m_backgroundBrush = QBrush(m_settingData->kIconBackgroundColor); } m_toolTipFlags=m_settingData->toolTipDockFlags; clearValues(); loadIcons(); loadImages(); createMainMenu(); m_mainLayer = new QImage(22,22,QImage::Format_ARGB32); m_backgroundLayer = new QImage(22,22,QImage::Format_ARGB32); setIconBackgroundLayer(); initSysTrayImage(); setToolTip("KNutClient"); changeKIcon(); // this function calls function repaintIcon // Uses own working of signal activated because in parent class signal activated is connected to activatedOrHide, // but procedure activatedOrHide doesn't work when parent object is 0. connect (this, SIGNAL (activated ( QSystemTrayIcon::ActivationReason )), this, SLOT(slotActivated ( QSystemTrayIcon::ActivationReason ))); } KNutDock::~KNutDock(){ delete m_mainLayer; delete m_backgroundLayer; delete m_menu; } void KNutDock::loadIcons (void) { m_errorIcon = KIcon(UserIcon("knc_error")); m_connectionIcon = KIcon (UserIcon("knc_conn")); m_idleIcon = KIcon (UserIcon("knc_main.png")); } void KNutDock::setIconBackgroundLayer (void) { QPainter paint; paint.begin(m_backgroundLayer); paint.fillRect(QRect(0,0,22,22),m_backgroundBrush); paint.end(); } void KNutDock::loadImages (void) { // aplications's own icons -- there are beckground for dock icons m_upsPix = UserIcon("knc_ups").toImage(); m_battPix = UserIcon("knc_batt").toImage(); } void KNutDock::changeUps (void) { m_upsServerMenu->clear(); createUpsMenu(); } void KNutDock::clearDockValues(void){ clearValues(); initSysTrayImage(); // paints standart icon } void KNutDock::changeToolTip(void){ m_toolTipFlags=m_settingData->toolTipDockFlags; toolTip(m_runtimeValue, m_statusValue, m_batteryChargeValue, m_upsLoadValue); } void KNutDock::changeKIBColor(void) { if (!m_settingData->customKIconColor) { m_backgroundBrush = m_backgroundGlobalBrush; } else { m_backgroundBrush = QBrush(m_settingData->kIconBackgroundColor); } setIconBackgroundLayer(); repaintDock(true); } void KNutDock::changeKIcon (void) { m_typeOfIcon = m_settingData->typeOfKIcon; m_statusWarningValue = m_statusValue & (KNutNet::CAL | KNutNet::TRIM | KNutNet::BOOST | KNutNet::OVER | KNutNet::RB); repaintDock(true); } void KNutDock::initSysTrayImage(void) { setIcon(m_idleIcon); m_dataOk = m_dataOkOld= idle; //status of ups connecting -- ups isn't connected } void KNutDock::setNewUPS(void) { m_upsServerMenu->clear(); createUpsMenu(); } void KNutDock::repaintDock (const bool always) { if (m_activeUpsInfo->upsNet == 0) return; m_dataOkOld=m_dataOk; if (m_activeUpsInfo->netError) m_dataOk = error; // error is value not variable else { // makes OKIcon when is needed and sets m_dataOk - status of Icon if ((m_activeUpsInfo->upsNet->getState() == KNutNet::Connected) && (m_activeUpsInfo->upsNet->readStatus() != KNutNet::NS)) { // paints icons with information values //m_statusValue : NS is NONE STATUS m_dataOk = ok; if (dataValueIsChanged() || always) makeOkIcon(); toolTip(m_runtimeValue, m_statusValue, m_batteryChargeValue, m_upsLoadValue); } else { if ((m_activeUpsInfo->upsNet->getState() == KNutNet::Connecting) || (m_activeUpsInfo->upsNet->getState() == KNutNet::HostLookup)) m_dataOk = connecting; else m_dataOk = idle; } } if (m_dataOk == ok) { setIcon(KIcon( QPixmap::fromImage(*m_mainLayer))); } else { if ((m_dataOk != m_dataOkOld) or always) { toolTip(0, -1, 0, 0); m_dataOkOld=m_dataOk; if (m_dataOk == connecting) setIcon(m_connectionIcon); // knutNet is in connecting state else { if (m_dataOk == error) setIcon(m_errorIcon); // knutNet is in error state else { setIcon(m_idleIcon); // knutNet is in idle state } } } } } bool KNutDock::dataValueIsChanged(void) { QString valueName; bool okFloat; QString nutStringVar; int myStatusValue; int myStatusBatValue; int myRuntimeValue; int myUpsLoadValue; int myBatteryChargeValue; bool repaintNow = false; //value isn't changed // **********reads values of STATUS *************** myStatusValue = m_activeUpsInfo->upsNet->readStatus(); myStatusBatValue = myStatusValue & KNutNet::OB; // OB = UPS runs on battery // **********reads value of RUNTIME*************** if (!m_activeUpsInfo->upsNet->existName(m_activeUpsInfo->runtimeVar)) { nutStringVar = m_activeUpsInfo->upsNet->readStringVar(m_activeUpsInfo->runtimeVar); if (nutStringVar.isEmpty()) myRuntimeValue=knc::numberVarError; else { myRuntimeValue = (int)nutStringVar.toFloat(&okFloat); if (!okFloat) myRuntimeValue = knc::numberVarError; } } else myRuntimeValue = knc::numberVarError; // **********reads value of UPS LOAD*************** if (m_activeUpsInfo->nutVariables == 1) valueName = "LOADPCT"; else valueName = "ups.load"; if (!m_activeUpsInfo->upsNet->existName(valueName)) { nutStringVar = m_activeUpsInfo->upsNet->readStringVar(valueName); if (nutStringVar.isEmpty()) myUpsLoadValue=knc::numberVarError; else { myUpsLoadValue = (int)nutStringVar.toFloat(&okFloat); if (!okFloat) myUpsLoadValue=knc::numberVarError; } } else myUpsLoadValue=knc::numberVarError; // *********reads value of BATTERY CHARGE**************** if (m_activeUpsInfo->nutVariables == 1) valueName="BATTPCT"; else valueName="battery.charge"; if (!m_activeUpsInfo->upsNet->existName(valueName)) { nutStringVar = m_activeUpsInfo->upsNet->readStringVar(valueName); if (nutStringVar.isEmpty()) myBatteryChargeValue=knc::numberVarError; else { myBatteryChargeValue = (int)nutStringVar.toFloat(&okFloat); if (!okFloat) myBatteryChargeValue = knc::numberVarError; } } else myBatteryChargeValue=knc::numberVarError; // **********STATUS************** if (myStatusValue !=m_statusValue ) { m_statusValue = myStatusValue; m_statusWarningValue = myStatusValue & (KNutNet::CAL | KNutNet::TRIM | KNutNet::BOOST | KNutNet::OVER | KNutNet::RB); repaintNow = true; } // **********RUNTIME*********** if (myRuntimeValue != m_runtimeValue) { m_runtimeValue = myRuntimeValue; // runtime is old value of runtime, one is defined like global value of class repaintNow = true; } // ************LOAD******************** if (myUpsLoadValue != m_upsLoadValue) { m_upsLoadValue = myUpsLoadValue; repaintNow = true; } // ***********CHARGE****************** if (myBatteryChargeValue != m_batteryChargeValue) { m_batteryChargeValue = myBatteryChargeValue; repaintNow = true; } // ************** STATUS BATT*************** // for set repaintNow only if (myStatusBatValue != m_statusBatValue) { m_statusBatValue = myStatusBatValue; repaintNow = true; } return repaintNow; } void KNutDock::makeOkIcon(void) { QPainter paint; switch (m_typeOfIcon) { case generalKI: *m_mainLayer = m_backgroundLayer->copy(QRect(0,0,22,22)); paint.begin(m_mainLayer); paintStatus(paint, m_statusValue); paintRuntime(paint, m_runtimeValue, m_statusValue); paintLoadGeneralKI(paint, m_upsLoadValue); paintChargeGeneralKI(paint, m_batteryChargeValue); paint.end(); break; case pictureKI: if (m_statusValue & KNutNet::OL) { // ONLINE - icon of UPS int myLoad; QPainter paint; *m_mainLayer = m_upsPix.copy(QRect(0,0,22,22)); paint.begin(m_mainLayer); if (m_upsLoadValue == knc::numberVarError) myLoad=0; else { myLoad = (int)(((double)m_upsLoadValue/10)+0.5); } if (m_upsLoadValue != knc::numberVarError) { if (myLoad > 12) myLoad=12; if (myLoad > 10) myLoad++; // preskocime rysku pro 100 % if (myLoad < 9) paint.setPen(QColor(0,192,0)); //green else { if (myLoad < 11) paint.setPen(QColor(255,255,0)); //yellow else paint.setPen(QColor(255,0,0));//red } for (int i = 19; i < 22; i++) paint.drawLine(i,12,i,12-myLoad +1); if (myLoad < 13) { paint.setPen(QColor(168,220,255)); for (int i = 20; i < 23; i++ ) paint.drawLine(i,0,i,12-myLoad); } } paint.setPen(m_textColor); // line for 100 % load paint.drawLine(18,2,21,2); paintNumbers (m_upsLoadValue, -2, 15, &paint ); if (!m_statusWarningValue) paintOKPoint(paint); else paintErrorPoint(paint); paint.end(); } else { // offline -- battery icon *m_mainLayer = m_battPix.copy(QRect(0,0,22,22)); paint.begin(m_mainLayer); paintChargePictureKI(paint, m_batteryChargeValue); paint.end(); } break; } ///////////////////// end of models } void KNutDock::toolTip (int runtime, int status, int batteryCharge, int upsLoad ) { QString text; QString manufacturer = ""; QString upsModel = ""; QString serial = ""; QString firmware = ""; int myNetErr = 0; int min = abs(runtime/60); int sec = runtime - (min*60); if (m_activeUpsInfo->upsNet != 0) { myNetErr= m_activeUpsInfo->upsNet->getError(); switch (m_activeUpsInfo->nutVariables) { case KNutNet::versionVarOne: manufacturer = m_activeUpsInfo->upsNet->readStringVar("MFR"); upsModel = m_activeUpsInfo->upsNet->readStringVar("MODEL"); serial = m_activeUpsInfo->upsNet->readStringVar("SERIAL"); firmware = m_activeUpsInfo->upsNet->readStringVar("FIRMREV"); break; case KNutNet::versionVarTwo: manufacturer = m_activeUpsInfo->upsNet->readStringVar("ups.mfr"); upsModel = m_activeUpsInfo->upsNet->readStringVar("ups.model"); serial = m_activeUpsInfo->upsNet->readStringVar("ups.serial"); firmware = m_activeUpsInfo->upsNet->readStringVar("ups.firmware"); break; case KNutNet::versionVarUnknown: manufacturer = ""; upsModel = ""; serial = ""; firmware = ""; break; } } text = i18n("Name")+" : "+m_activeUpsInfo->record.name + "\n" +i18n("UPS name")+" : "+m_activeUpsInfo->record.upsName + "\n" +i18n("UPS address")+" : "+m_activeUpsInfo->record.upsAddress +"\n" +i18n("Status : "); if (status == -1) { text += i18n("Connection doesn't exist."); } else { if (status & KNutNet::OL) { text += i18n("UPS On line"); } else { if (status & KNutNet::OB) { text += i18n("UPS On battery"); } else { if (status & KNutNet::OFF) { text += i18n("UPS Of line"); } } } if (status & KNutNet::LB) { text += "\n" + i18n("Status : ") + i18n("UPS Battery is low"); } if (status & KNutNet::RB) { text += "\n" + i18n("Status : ") + i18n("Replace battery"); } if (status & KNutNet::CAL) { text += "\n" + i18n("Status : ") + i18n("UPS is performing calibration"); } if (status & KNutNet::OVER) { text += "\n" + i18n("Status : ") + i18n("UPS is Overload"); } if (status & KNutNet::TRIM) { text += "\n" + i18n("Status : ") + i18n("UPS is trimming voltage"); } if (status & KNutNet::BOOST) { text += "\n" + i18n("Status : ")+ i18n("UPS is boosting voltage"); } } if ((status == -1) && (myNetErr != KNutNet::NoError)) { text += "\n" + i18n("Error : ")+ KNutVarData::errorToText(myNetErr); } if (m_toolTipFlags & TTMFR) text += "\n" + i18n("Manufac. : ")+ manufacturer; if (m_toolTipFlags & TTModel) text += "\n" + i18n("Name")+" : "+ upsModel; if (m_toolTipFlags & TTSerial) text += "\n" + i18n("Serial")+" : "+ serial; if (m_toolTipFlags & TTFirm) text += "\n" + i18n("Firmware")+" : "+ firmware; if (m_toolTipFlags & TTRun) { if (runtime != knc::numberVarError) text += "\n" + i18n("Runtime") + i18n(" : %1:%2 min").arg(min).arg(sec); } if (m_toolTipFlags & TTCharge) { if (batteryCharge != knc::numberVarError) text += "\n" + i18n("Battery Charge") + QString(" : %1 %").arg(batteryCharge); } if (m_toolTipFlags & TTLoad) { if (upsLoad != knc::numberVarError) text += "\n" + i18n("UPS Load") + QString(" : %1 %").arg(upsLoad); } setToolTip(text); } /*********************************************************************************************/ /* */ /* PRIVATE SLOTS */ /* */ /*********************************************************************************************/ void KNutDock::slotActivated ( QSystemTrayIcon::ActivationReason reason ) { if (reason == QSystemTrayIcon::Trigger) { activeMainWindow(); } } void KNutDock::slotShowMyAbout() { KAboutApplicationDialog *dialog = new KAboutApplicationDialog(KGlobal::config()->componentData().aboutData()); dialog->exec(); delete dialog; } void KNutDock::slotExitApplication (void) { emit endApplication(); } void KNutDock::slotUpsName(QAction *upsAction) { QString upsName(upsAction->text()); upsName.remove('&'); emit UPSChanged(upsName); } void KNutDock::slotMinimize(void) { emit minimize(); } void KNutDock::slotPreferences(void) { emit preferences(); } void KNutDock::slotPrintUPSVars(void) { emit printUPSVars(); } void KNutDock::slotInstComms(void) { emit instComms(); } void KNutDock::slotRWVars(void) { emit RWVars(); } void KNutDock::slotRefreshConnection(void) { emit makeRefreshConnection(); } //------------------------------------------ //bool KNutDock::event(QEvent *e) { // // if ( e->type() == QEvent::MouseButtonPress) { // qDebug("KNutDock::mousePressEvent"); // QMouseEvent *mouseEvent = static_cast(e); // if( mouseEvent->button()==Qt::LeftButton ) emit activeMainWindow(); // if( mouseEvent->button()==Qt::RightButton ) m_menu->popup(mouseEvent->globalPos()); // } // else { // return KSystemTrayIcon::event( e ); // } // return true; // } /*********************************************************************************************/ /* */ /* PRIVATE FUNCTIONS */ /* */ /*********************************************************************************************/ void KNutDock::clearValues(void) { m_batteryChargeValue = 0; m_runtimeValue = 0; m_upsLoadValue = 0; m_statusValue = 0; } void KNutDock::createUpsMenu(void) { QActionGroup *upsGroup = new QActionGroup(this); int n = m_upsRecords->getCount(); for (int i =0; i < n; i++) { KAction *upsAction = new KAction (m_upsRecords->getName(i),this); upsAction->setCheckable (true); upsGroup->addAction(upsAction); if (m_activeUpsInfo->record.name == m_upsRecords->getName(i)) { upsAction->setChecked(true); } m_upsServerMenu->addAction(upsAction); } connect( upsGroup, SIGNAL( triggered(QAction *) ), this, SLOT(slotUpsName(QAction *) )); } void KNutDock::createMainMenu(void) { m_menu = new KMenu(); QString KNCName = KGlobal::config()->componentData().aboutData()->appName(); m_menu->addTitle (KIcon(KNCName),KNCName); m_menu->addSeparator(); m_upsServerMenu = (KMenu *)m_menu->addMenu(KIcon(),"UPS"); m_menu->addSeparator(); m_menu->addAction(KIcon("view-list-tree"),i18n("&Showing UPS variables and commands"), this, SLOT(slotPrintUPSVars())); m_menu->addAction(i18n("&Running instant commands"), this, SLOT(slotInstComms())); m_menu->addAction(i18n("Setting R&W variables"), this, SLOT(slotRWVars())); m_menu->addSeparator(); m_menu->addAction(KIcon("view-refresh"),i18n("Reconnect"), this, SLOT(slotRefreshConnection())); m_menu->addSeparator(); m_menu->addAction(KIcon("configure"),i18n("&Preferences"), this, SLOT(slotPreferences())); m_menu->addSeparator(); m_menu->addAction(KIcon(KNCName),i18n("&About KNutClient"), this, SLOT(slotShowMyAbout())); m_menu->addSeparator(); m_menu->addAction(i18n("&Minimize"), this, SLOT(slotMinimize())); m_menu->addSeparator(); m_menu->addAction (KIcon("application-exit"),i18n("&Exit"),this ,SLOT(slotExitApplication())); createUpsMenu(); setContextMenu(m_menu); } void KNutDock::paintChargeGeneralKI (QPainter &paint, int charge ) { if (charge > 199) charge = 199; if (m_typeOfIcon == generalKI) { if (charge != knc::numberVarError) { if (charge < 40) paint.setPen(Qt::red); else paint.setPen(m_textColor); paintNumbers(charge,8,2,&paint); } else { paint.setPen(m_textColor); paintDash (13,2,&paint); paintDash (18,2,&paint); } } } void KNutDock::paintChargePictureKI (QPainter &paint, int charge ) { if (charge != knc::numberVarError) { if (m_batteryChargeValue < 40) paint.setPen(Qt::red); else paint.setPen(m_textColor); paintNumbers(m_batteryChargeValue,-2,15,&paint); if (m_batteryChargeValue < 40) paint.setPen(Qt::red); else paint.setPen(Qt::green); int delka = abs((16*m_batteryChargeValue)/100); delka += abs((delka-1)/4) -1; paint.drawLine (1,7,1+delka,7); paint.drawLine (1,8,1+delka,8); paint.drawLine (1,9,1+delka,9); paint.setPen(m_textColor); paint.drawLine (5,6,5,10); paint.drawLine (10,6,10,10); paint.drawLine (15,6,15,10); } else { paint.setPen(m_textColor); paintDash (3,15,&paint); paintDash (8,15,&paint); } } void KNutDock::paintErrorPoint ( QPainter& paint ) { // paint.setPen(QColor(0,0,255)); paint.setPen(QColor(255,0,0)); paint.drawLine(19,17,21,17); paint.drawLine(19,18,21,18); paint.drawLine(19,19,21,19); } void KNutDock::paintOKPoint (QPainter& paint ) { paint.setPen(QColor(0,255,0)); paint.drawLine(19,17,21,17); paint.drawLine(19,18,21,18); paint.drawLine(19,19,21,19); } void KNutDock::paintStatus (QPainter &paint, int status ) { int lastPos = 0; if (status & KNutNet::OL) { paint.setPen(m_textColor); paintChar (1,2,'P',&paint); } else { if (status & KNutNet::OB) { paint.setPen(Qt::red); paintChar (1,2,'B',&paint); } } if (status & KNutNet::LB) { paint.setPen(Qt::red); paintChar (6,2,'L',&paint); } if ((lastPos <2) && (status & KNutNet::RB)) { paint.setPen(Qt::red); paintChar (6,2,'R',&paint); lastPos++; } if ((lastPos <2) && (status & KNutNet::BOOST)) { paint.setPen(Qt::red); paintChar (6,2,'B',&paint); lastPos++; } if ((lastPos <2) && (status & KNutNet::TRIM)) { paint.setPen(Qt::red); paintChar (6,2,'T',&paint); lastPos++; } if ((lastPos <2) && (status & KNutNet::CAL)) { paint.setPen(Qt::red); paintChar (6,2,'C',&paint); lastPos++; } } void KNutDock::paintRuntime (QPainter &paint, int runtime, int status ) { if (status & KNutNet::OB) paint.setPen(Qt::red); else paint.setPen(m_textColor); if (runtime != knc::numberVarError) { int min = abs(runtime/60); int sec = runtime - (min*60); paintNumber(1,11, abs(min/10) ,&paint); paintNumber(6,11,min-((abs(min/10))*10) ,&paint); paintNumber(13,11, abs(sec/10) ,&paint); paintNumber(18,11,sec-((abs(sec/10))*10) ,&paint); } else { paintDash (1,11,&paint); paintDash (6,11,&paint); paintDash (13,11,&paint); paintDash (18,11,&paint); } paint.drawLine (11,12,11,13); paint.drawLine (11,15,11,16); } void KNutDock::paintLoadGeneralKI (QPainter &paint, int load ) { int myLoad; if (load == knc::numberVarError) myLoad=0; else myLoad = abs(load/10); if (m_typeOfIcon == generalKI) { if (load != knc::numberVarError) { if (myLoad > 11) myLoad=11; if (myLoad < 9) paint.setPen(Qt::green); else { if (myLoad < 11) paint.setPen(Qt::yellow); else paint.setPen(Qt::red); } paint.setPen(QColor(Qt::green).light(60)); for (int i = 0; i < myLoad; i++) { paint.drawLine((i*2)+1,19,(i*2)+1,21); } paint.setPen(QColor(Qt::cyan).light(150)); for (int i = myLoad; i < 11; i++) { paint.drawLine((i*2)+1,19,(i*2)+1,21); } } } } void KNutDock::paintNumbers (int numbers, int x, int y, QPainter* p ) { bool first = false; if (numbers > 199) numbers = 199; if (numbers != knc::numberVarError) { if (numbers > 99) { paintNumber (x,y,1,p); numbers -= 100; first=true; } int second = abs (numbers/10); int third = numbers - (second * 10); if ((second != 0) || (first)) paintNumber (x+5,y,second,p); paintNumber (x+10,y,third,p); } else { p->setPen(m_textColor); paintDash (x+5,y,p); paintDash (x+10,y,p); } } void KNutDock::paintDash (int x, int y, QPainter *p) { p->drawLine(x,y+3,x+3,y+3); } void KNutDock::paintNumber (int x, int y, int number, QPainter *p) { // x and y are left top corner if ((number > -1) && (number < 10)) { // painting - kreslim switch (number) { case 0: p->drawRect(x,y,3,6); break; case 1: p->drawLine (x+3,y,x+3,y+6); break; case 2: p->drawLine(x,y,x+3,y); p->drawLine(x+3,y,x+3,y+3); p->drawLine(x+3,y+3,x,y+3); p->drawLine(x,y+3,x,y+6); p->drawLine(x,y+6,x+3,y+6); break; case 3: p->drawLine(x,y,x+3,y); p->drawLine(x+3,y,x+3,y+6); p->drawLine(x+3,y+6,x,y+6); p->drawLine(x,y+3,x+3,y+3); break; case 4: p->drawLine(x,y,x,y+3); p->drawLine(x,y+3,x+3,y+3); p->drawLine (x+3,y,x+3,y+6); break; case 5: p->drawLine(x+3,y,x,y); p->drawLine(x,y,x,y+3); p->drawLine(x,y+3,x+3,y+3); p->drawLine(x+3,y+3,x+3,y+6); p->drawLine(x+3,y+6,x,y+6); break; case 6: p->drawRect(x,y+3,3,3); p->drawLine(x,y+3,x,y); p->drawLine(x,y,x+3,y); break; case 7: p->drawLine(x,y,x+3,y); p->drawLine(x+3,y,x+3,y+6); break; case 8: p->drawRect(x,y,3,6); p->drawLine(x,y+3,x+3,y+3); break; case 9: p->drawRect(x,y,3,3); p->drawLine(x+3,y+3,x+3,y+6); p->drawLine(x+3,y+6,x,y+6); break; } } } void KNutDock::paintChar (int x, int y, char LCDChar, QPainter *p) { // x and y are left up corner switch (LCDChar) { case 'L': p->drawLine(x,y,x,y+6); p->drawLine(x,y+6,x+3,y+6); break; case 'O': p->drawRect(x,y,4,7); break; case 'B': p->drawLine(x,y,x,y+6); p->drawLine(x,y+6,x+2,y+6); p->drawLine(x,y,x+2,y); p->drawLine(x,y+3,x+2,y+3); p->drawLine(x+3,y+1,x+3,y+2); p->drawLine(x+3,y+4,x+3,y+5); break; case 'U': p->drawLine(x,y,x,y+6); p->drawLine(x,y+6,x+3,y+6); p->drawLine(x+3,y+6,x+3,y); break; case 'C': p->drawLine(x+3,y+1,x+3,y); p->drawLine(x+3,y,x,y); p->drawLine(x,y,x,y+6); p->drawLine(x,y+6,x+3,y+6); p->drawLine(x+3,y+6,x+3,y+5); break; case 'R': p->drawLine(x,y,x,y+6); p->drawLine(x,y,x+2,y); p->drawLine(x,y+3,x+2,y+3); p->drawLine(x+3,y+1,x+3,y+2); p->drawLine(x+3,y+4,x+3,y+6); break; case 'P': p->drawLine(x,y,x,y+6); p->drawLine(x,y,x+2,y); p->drawLine(x,y+3,x+2,y+3); p->drawLine(x+3,y+1,x+3,y+2); break; case 'T': p->drawLine(x+2,y,x+2,y+6); p->drawLine(x,y,x+4,y); break; } } #include "knutdock.moc" knc105/src/knutanalog.cpp0000644000175000017500000005623111436653644013626 0ustar dandan /*************************************************************************** * Copyright (C) 2007 by Daniel Prynych * * Daniel@prynych.cz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "knutanalog.h" /* pocitani uhlu */ /* nula je ve 3 hodiny */ /* prirustek je kladny ve smeru hod rucicek */ #include #include #include #include #include #include #include #include #include #include //#include KNutAnalog::KNutAnalog( QWidget *parent, int bottomLimit, int topLimit, int typeOfView, int countOfParts, int countOfSubParts, QColor pointerColor, QColor scaleColor, QColor textColor, QFont *analogFonts, int qualityOfPointer ) : QFrame( parent), m_bottomLimit(bottomLimit), m_topLimit(topLimit), m_typeOfView(typeOfView), m_countOfParts(countOfParts), m_countOfSubParts(countOfSubParts), m_pointerColor(pointerColor), m_scaleColor(scaleColor) ,m_textColor(textColor) { qDebug("KNutAnalog::KNutAnalog"); if (qualityOfPointer < 0 ) { qualityOfPointer = 0; } else { if (qualityOfPointer > 5 ) { qualityOfPointer = 5; } } if ( qualityOfPointer==0) { m_speedOfAAlias=none; m_makeBlurMotion=false; } else { if ((qualityOfPointer==2) || (qualityOfPointer== 4)) m_speedOfAAlias=slow; else m_speedOfAAlias=fast; if ((qualityOfPointer==3) || (qualityOfPointer== 4)) m_makeBlurMotion=true; else m_makeBlurMotion=false; } if (m_countOfParts > 6) m_countOfParts=6; else if (m_countOfParts < 2) m_countOfParts=2; if ( m_countOfSubParts > 6 ) m_countOfSubParts = 6; if ( m_countOfSubParts == 0 ) { if (m_countOfParts < 4) m_countOfSubParts =5; else { if (m_countOfParts < 6) m_countOfSubParts=4; else m_countOfSubParts =3; } } m_valueOfPointer=m_bottomLimit; // sets starting value of pointer /* hodnoty zavisle na typu zobrazeni */ switch (m_typeOfView) { case 1 : m_direction = 1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ m_angleOfViewer=270; m_startAngle=225; m_centerX=m_widthOfBackGround/2; m_centerY=m_widthOfBackGround/2; m_widthOfScale=118; m_radiusOfScaleNumbers=37; break; case 2 : m_direction = -1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ m_angleOfViewer=90; m_startAngle=0; m_centerX=13; m_centerY=110; m_widthOfScale=210; m_radiusOfScaleNumbers=83; break; case 3 : m_direction = 1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ m_angleOfViewer=90; m_startAngle=135; m_centerX=m_widthOfBackGround/2; m_centerY=m_widthOfBackGround-15; m_widthOfScale=170; m_radiusOfScaleNumbers=65; break; } // konec hodnot zavislych na typu zobrazeni if (analogFonts == 0) { // pokud neni predan font nastavi se systemovy font m_scaleFont = kapp->font(); m_textFont = kapp->font(); } else { m_scaleFont= *analogFonts; m_textFont= *analogFonts; } m_scaleFont.setBold (FALSE); m_textFont.setBold (TRUE); m_countOfColorParts = 0; setMinimumSize( AnalogWidth, AnalogWidth ); setMaximumSize( AnalogWidth, AnalogWidth ); setFrameStyle( QFrame::Box | QFrame::Raised ); setLineWidth( 2 ); m_backgroundBigImage = new QImage ( (m_widthOfBackGround) * 3,(m_widthOfBackGround)*3, QImage::Format_RGB32 ); m_backgroundSmallImage = new QImage (m_widthOfBackGround, m_widthOfBackGround, QImage::Format_RGB32); m_scaleLayerSmall = new QPixmap ( (m_widthOfBackGround), (m_widthOfBackGround)); // m_scaleLayerSmall->fill(palette().color(backgroundRole()).rgb()); //color if background setDefaultArcColor(); // sets standard registers // nastavime standartni registry } KNutAnalog::~KNutAnalog() { delete (m_scaleLayerSmall); } void KNutAnalog::makeBackground (const bool run) { qDebug("KNutAnalog::makeBackground"); paintBackground(); if (run) { repaint(); } } void KNutAnalog::setText (const QString &inscription, const QString &text_up) { m_inscription=inscription; AnMJ=text_up; } void KNutAnalog::setDefaultArcColor(void) { m_arcColors[0] = Qt::white; m_arcColors[1] = Qt::green; m_arcColors[2] = Qt::yellow; m_arcColors[3] = Qt::red; m_arcColors[4] = Qt::blue; m_arcColors[5] = Qt::cyan; m_arcColors[6] = Qt::magenta; m_arcColors[7] = Qt::gray; m_arcColors[8] = Qt::black; } void KNutAnalog::setArcColor(const int reg, const QColor &color ) { if ((reg > -1) && (reg < 9)) m_arcColors[reg] = color; } void KNutAnalog::addArc (const double startOfCircle, const double endOfCircle, const int regColor) { if (m_countOfColorParts < 5) { m_extentOfDye[m_countOfColorParts].start=startOfCircle; m_extentOfDye[m_countOfColorParts].end=endOfCircle; if ((regColor <0) || (regColor > 8)) { m_extentOfDye[m_countOfColorParts++].color=0; } else { m_extentOfDye[m_countOfColorParts++].color=regColor; } } } void KNutAnalog::delArc (void) { m_countOfColorParts = 0; } void KNutAnalog::setRange (const int Astart, const int Aend ,const bool run) { m_bottomLimit=Astart; m_topLimit=Aend; if ((m_bottomLimit != Astart) or (m_topLimit != Aend)) { // pokud zmenime rozasah musime prekrelit i rucicku if (run) { paintWholeLayer(true); // repaint pointer and background repaint (); } } } void KNutAnalog::setMember (const int Count, const bool run) { m_countOfParts=Count; paintWholeLayer(true); if (run) { repaint (); } } void KNutAnalog::setPointerColor (const QColor &pointerColor ) { m_pointerColor = pointerColor; } void KNutAnalog::repaintPointer (void ) { paintWholeLayer (false); } void KNutAnalog::setFontColor (const QColor &fontColor ) { m_textColor = fontColor; } void KNutAnalog::setScaleColor (const QColor &scaleColor) { m_scaleColor = scaleColor; } void KNutAnalog::setDigitalProcesing (const int qualityOfPointer, const bool run ) { int qop; if (qualityOfPointer < 0) qop= 0; else { if (qualityOfPointer > 4) qop = 4; else qop = qualityOfPointer; } if ( qop==0) { m_speedOfAAlias=none; m_makeBlurMotion=false; } else { if ((qop==2) || (qop== 4)) { m_speedOfAAlias=slow; } else { m_speedOfAAlias=fast; } if ((qop==3) || (qop== 4)) { m_makeBlurMotion=true; } else { m_makeBlurMotion=false; } } paintWholeLayer (true); if (run) repaint (); } void KNutAnalog::setPointer (const double pointerValue ) { qDebug("KNutAnalog::setPointer"); if (m_valueOfPointer != pointerValue) { m_valueOfPointer = pointerValue; paintWholeLayer (false); } } //************** PUBLIC SLOTS ********************************** void KNutAnalog::slotSetScaleFont(QFont newScaleFont){ m_scaleFont = newScaleFont; paintWholeLayer(true); repaint(); } void KNutAnalog::slotSetTextFont(QFont newTextFont){ m_textFont = newTextFont; paintWholeLayer(); paintWholeLayer (true); repaint(); } void KNutAnalog::slotSetAllFont(QFont newAllFont){ m_scaleFont = newAllFont; m_textFont = newAllFont; m_scaleFont.setBold (FALSE); m_textFont.setBold (TRUE); paintWholeLayer (true); repaint(); } void KNutAnalog::repaintAll (void) { paintWholeLayer(true); repaint (); } //************** protected **************************** void KNutAnalog::resizeEvent( QResizeEvent * ) { } void KNutAnalog::paintEvent( QPaintEvent *e ) { if (isVisible()) { QRect layerRect(0,0,m_widthOfBackGround, m_widthOfBackGround); QPoint leftTopPoint( m_startOfBackGround, m_startOfBackGround); QFrame::paintEvent(e); QPainter localPainter; localPainter.begin(this); localPainter.drawPixmap( leftTopPoint, *m_scaleLayerSmall, layerRect); localPainter.end(); } } //***************private ************************ void KNutAnalog::paintBackground ( void ) { QPainter paint; qDebug ("KNutAnalog::paintBackGround"); m_backgroundBigImage->fill(palette().color(backgroundRole()).rgb()); //color if background paint.begin ( m_backgroundBigImage ); paint.setBackgroundMode(Qt::OpaqueMode); paint.setBackground(palette().color(backgroundRole())); paintPartOfCircle(&paint, m_centerX*3, m_centerY*3,m_widthOfScale*3); //CMK pro inter paintScale(&paint, m_centerX*3, m_centerY*3,m_widthOfScale*3); // Scale paint.end(); if (m_speedOfAAlias == none) { makeMotionBlur(m_backgroundBigImage,m_backgroundBigImage->pixel(1,1)); *m_backgroundSmallImage = makeAntialiasing(m_backgroundBigImage, m_backgroundBigImage->pixel(1,1),slow); } } void KNutAnalog::paintWholeLayer( const bool repaintBackground) { QPainter paint; qDebug ("KNutAnalog::paintWholeLayer"); if (repaintBackground) paintBackground(); if (m_speedOfAAlias == none) { QImage pointerSmallImage(*m_backgroundSmallImage); paintPointerFastly ( pointerSmallImage, m_valueOfPointer); *m_scaleLayerSmall = QPixmap::fromImage(pointerSmallImage); } else { QImage pointerBigImage (*m_backgroundBigImage); paintPointerSlowly ( pointerBigImage, m_valueOfPointer, m_centerX*3, m_centerY*3,m_widthOfScale*3); makeMotionBlur(&pointerBigImage,pointerBigImage.pixel(1,1)); QImage smallImage = makeAntialiasing(&pointerBigImage, pointerBigImage.pixel(1,1),slow); *m_scaleLayerSmall = QPixmap::fromImage(smallImage); } paint.begin( m_scaleLayerSmall ); // paint on layer of scale // painting numbers paintScaleNumbers( &paint ); //painting of numbers // painting texts paintText( &paint ); paintValueOfPointer ( &paint, m_valueOfPointer); paint.end (); } void KNutAnalog::paintPointerSlowly (QImage &pointerImage, double position, int centerX , int centerY, int widthOfCircle) { qDebug("KNutAnalog::paintPointerSlowly"); QPainter paint; double angle; int lengthOfPointer = widthOfCircle / 2 - 12; if (position < m_bottomLimit) position=m_bottomLimit; else { if (position > m_topLimit) position = m_topLimit; } // painting of pointer angle = ((m_angleOfViewer/(m_topLimit-m_bottomLimit))*(position-m_bottomLimit))*((-1)*m_direction)+m_startAngle; paint.begin( &pointerImage ); // paints of pointer paint.setBackgroundMode(Qt::OpaqueMode); paint.setBrush( m_pointerColor ); // sets color paint.setPen ( m_pointerColor ); QPolygon pts; // k posuvu a k otoceni pouziva funkce paintu // for rotate and translate uses functions of paint paint.translate (centerX, centerY); paint.rotate(-angle); pts.setPoints( 4, -6, 0, 0, -6, lengthOfPointer, 0, 0, 6 ); paint.drawConvexPolygon( pts ); paint.end (); } void KNutAnalog::paintPointerFastly (QImage &pointerImage, double position) { qDebug ("KNutAnalog::paintPointerFastly"); double uhel; QPainter paint(&pointerImage); int delka = m_widthOfScale / 2 - 4; paint.setBackgroundMode(Qt::OpaqueMode); if (position < m_bottomLimit) position=m_bottomLimit; else { if (position > m_topLimit) position = m_topLimit; } /* painting of pointer*/ uhel = ((m_angleOfViewer/(m_topLimit-m_bottomLimit))*(position-m_bottomLimit))*((-1)*m_direction)+m_startAngle; paint.setBrush( m_pointerColor ); // nastavime barvu paint.setPen ( m_pointerColor ); QPolygon pts; // for translate a rotate uses functions of paint // k posuvu a k otoceni pouziva funkce paintu paint.translate (m_centerX, m_centerY); paint.rotate(-uhel); pts.setPoints( 4, -2, 0, 0, -2, delka, 0, 0, 2 ); paint.drawPolygon( pts ); } void KNutAnalog::paintPartOfCircle ( QPainter *paint, int centerX , int centerY, int widthOfCircle ) { double Astart, Aend; qDebug("KNutAnalog::paintPartOfCircle"); // pocitani uhlu //nula je ve 3 hodiny // prirustek je kladny proti smeru hod rucicek //int extent = m_topLimit-m_bottomLimit; //rozsah // double extent = m_topLimit-m_bottomLimit; //rozsah // double jednotka = ((double)m_angleOfViewer/extent); double jednotka = ((double)m_angleOfViewer/(m_topLimit-m_bottomLimit)); bool painted = false; // int smerMK = (-1)*m_direction; // paints parts of circle for (int i=0;i m_bottomLimit)) { if (m_extentOfDye[i].start < m_bottomLimit) Astart = m_bottomLimit; else Astart = m_extentOfDye[i].start; if (m_extentOfDye[i].end > m_topLimit) Aend = m_topLimit; else Aend = m_extentOfDye[i].end; paint->setBrush ( m_arcColors[m_extentOfDye[i].color] ); paint->setPen (Qt::NoPen); paint->drawPie((centerX-widthOfCircle/2),(centerY-widthOfCircle/2),widthOfCircle,widthOfCircle,(int)((((Astart-m_bottomLimit)*jednotka)*((-1)*m_direction)+m_startAngle)*16),(int)(((-1)*m_direction)*((Aend-Astart)*jednotka)*16)); painted = true; // bylo provedeno vykresleni } } if ((m_countOfColorParts > 0) && (painted)) { // kreslime jen pokud bylo kreslena kruhova vysec // musime vybarvit stred kotouce //fills center of circle paint->setBrush ( paint->background().color() ); //The angles are 1/16th of a degree paint->drawPie((centerX-(widthOfCircle/2)+18),(centerY-(widthOfCircle/2)+18),widthOfCircle-36,widthOfCircle-36,(int)(m_startAngle*16+90*m_direction),(int)((-m_direction)*(m_angleOfViewer*16+180))); } } void KNutAnalog::paintScale ( QPainter *paint , int centerX , int centerY, int widthOfCircle) { int bottomMax = widthOfCircle/2 - 29; int bottom = widthOfCircle/2 -17 ; int smer_stup = (-1)*m_direction; paint->save(); paint->setPen ( m_scaleColor); paint->translate( centerX, centerY ); double stupne = smer_stup * (m_angleOfViewer/(m_countOfParts*(m_countOfSubParts))); // nakresleni prvni linky //paints of the first line paint->rotate( -m_startAngle); paint->setBrush ( m_scaleColor ); paint->drawRect( bottomMax,-1,30,3 ); for ( int i=0; i<(m_countOfParts); i++ ) { for ( int j=0; j<(m_countOfSubParts-1); j++) { paint->rotate( -stupne ); paint->drawRect( bottom,-1,18,2 ); } paint->rotate( -stupne ); paint->drawRect( bottomMax,-1,30,3 ); } paint->restore(); } QImage KNutAnalog::makeAntialiasing (QImage* bigImage, const QRgb colorOfBG, speedOfAAlias speed) { ulong imageRed; ulong imageGreen; ulong imageBlue; QRgb imageRgb; ulong sumOfRed; ulong sumOfGreen; ulong sumOfBlue; qDebug ("KNutAnalog::makeAntialiasing"); if (speed == slow) { sumOfRed = (qRed ( colorOfBG ))*9; sumOfGreen = (qGreen ( colorOfBG ))*9; sumOfBlue = (qBlue ( colorOfBG ))*9; } else { sumOfRed = (qRed ( colorOfBG ))*16; sumOfGreen = (qGreen ( colorOfBG ))*16; sumOfBlue = (qBlue ( colorOfBG ))*16; } int smallImageWidth=bigImage->width()/3; int smallImageHeight=bigImage->height()/3; QImage smallImage(smallImageWidth,smallImageHeight, bigImage->format()); for (int x = 0; x < smallImageWidth; x++) { for (int y = 0; y < smallImageHeight; y++) { imageRed = 0; imageGreen = 0; imageBlue = 0; if (speed == slow) { //// uses divide, slowly compute for (int xi = 0 ; xi < 3; xi ++) { for (int yi = 0 ; yi < 3; yi ++) { imageRgb = bigImage->pixel(x*3+xi,y*3+yi); imageRed += qRed ( imageRgb ); imageGreen += qGreen ( imageRgb ); imageBlue += qBlue ( imageRgb ); } } if (((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue))) { smallImage.setPixel (x,y,colorOfBG); } else { imageRed = imageRed / 9; imageGreen = imageGreen/9; imageBlue = imageBlue/9; smallImage.setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); } } else { //// uses bitmove, fastly compute for (int xi = 0 ; xi < 3; xi ++) { for (int yi = 0 ; yi < 3; yi ++) { if ((xi == 1) && (yi == 1)) { // center of 3x3 area imageRgb = bigImage->pixel(x*3+xi,y*3+yi); imageRed += qRed ( imageRgb )*4; imageGreen += qGreen ( imageRgb )*4; imageBlue += qBlue ( imageRgb )*4; } else { if ((xi == 1) || (yi == 1)) { imageRgb = bigImage->pixel(x*3+xi,y*3+yi); imageRed += qRed ( imageRgb )*2; imageGreen += qGreen ( imageRgb )*2; imageBlue += qBlue ( imageRgb )*2; } else { imageRgb = bigImage->pixel(x*3+xi,y*3+yi); imageRed += qRed ( imageRgb ); imageGreen += qGreen ( imageRgb ); imageBlue += qBlue ( imageRgb ); } } } } if ((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue)) { smallImage.setPixel (x,y,colorOfBG); } else { imageRed = imageRed >> 4; imageGreen = imageGreen >> 4; imageBlue = imageBlue >> 4; smallImage.setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); } } //end of fastly } } return smallImage; } void KNutAnalog::makeMotionBlur (QImage* image, const QRgb colorOfBG) { ulong imageRed, imageGreen, imageBlue; QRgb imageRgb; QImage *layerImageBlur; ulong sumOfRed, sumOfGreen, sumOfBlue; sumOfRed = (qRed ( colorOfBG ))*9; sumOfGreen = (qGreen ( colorOfBG ))*9; sumOfBlue = (qBlue ( colorOfBG ))*9; int imageWidth=image->width(); int imageHeight=image->height(); layerImageBlur = new QImage(*image); layerImageBlur->detach(); //costructor makes swallow copy, have to use detach for (int x = 1; x < imageWidth-2; x++) { for (int y = 1; y < imageHeight-2; y++) { imageRed = 0; imageGreen = 0; imageBlue = 0; for (int xi = -1 ; xi < 2; xi ++) { for (int yi = -1 ; yi < 2; yi ++) { imageRgb = layerImageBlur->pixel(x+xi,y+yi); imageRed += qRed ( imageRgb ); imageGreen += qGreen ( imageRgb ); imageBlue += qBlue ( imageRgb ); } } if (!((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue))) { imageRed = (int)(imageRed / 9); imageGreen = (int)(imageGreen/9); imageBlue = (int)(imageBlue/9); image->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); } } } delete layerImageBlur; } void KNutAnalog::paintScaleNumbers ( QPainter *paint ) { //paintig of scaleNumbers int poz_x, poz_y, r_vyska, r_sirka; double posun, angle; double upi = 0.0174532; int smer_st = -m_direction; paint->save(); // ulozime QString cislo; paint->setPen(m_textColor); paint->setFont(m_scaleFont); QFontMetrics fm = paint->fontMetrics(); r_vyska = ((fm.ascent()) / 2); posun = ((double)(m_topLimit-m_bottomLimit))/m_countOfParts; for (int i=0; i<=(m_countOfParts);i++) { cislo.sprintf( "%3.0f",m_bottomLimit+i*posun); cislo=cislo.trimmed(); r_sirka = (fm.width(cislo))/2; angle = (m_startAngle+ ((m_angleOfViewer/m_countOfParts)*i*smer_st))*upi; poz_x = (int)((cos(angle)*m_radiusOfScaleNumbers+m_centerX) - r_sirka); poz_y = (int)((m_centerY-sin(angle)*m_radiusOfScaleNumbers) + r_vyska); paint->drawText (poz_x,poz_y,cislo); } paint->restore(); } void KNutAnalog::paintText ( QPainter *paint ) { QString nadpis1; QString nadpis2; int index; if (m_inscription.length() >1) { if ((index = m_inscription.indexOf(" ")) != -1) { // mezera nalezena space found nadpis1 = m_inscription.left(index); nadpis2 = m_inscription.mid(index+1,(uint)(m_inscription.length() - index - 1)); } } else index = -1; paint->setPen(m_textColor); paint->setFont(m_textFont); QFontMetrics fm = paint->fontMetrics(); int r_vyska = fm.height()/ 2; switch (m_typeOfView) { // kruznice - kreslime dve radky nad sebou cemtrovane case 1 : if (index == -1 ) paint->drawText( m_centerX - fm.width(m_inscription)/2, 104 + r_vyska , m_inscription); else { // mame dve slova paint->drawText( m_centerX - fm.width(nadpis1)/2, 106 + r_vyska/2 - 2, nadpis1); paint->drawText( m_centerX - fm.width(nadpis2)/2, 106 + (r_vyska*3)/2 + 2, nadpis2); } paint->drawText( m_centerX - fm.width(AnMJ)/2, 44 + r_vyska , AnMJ); break; // ctvrt oblouk kreslime dve radky nad sebou centrovane v pravem hornim rohu case 2 : if (index == -1 ) paint->drawText( 121 - fm.width(m_inscription) , 6 + r_vyska , m_inscription); else { paint->drawText( 121 - fm.width(nadpis1) , 6 + r_vyska , nadpis1); paint->drawText( 121 - fm.width(nadpis2) , 10 + r_vyska*2 , nadpis2); } paint->drawText( m_centerX , 68 + r_vyska*2 , AnMJ); break; // horni oblouk case 3 : paint->drawText( m_centerX - fm.width(m_inscription)/2, 6 + r_vyska , m_inscription); paint->drawText( m_widthOfBackGround -5 -fm.width(AnMJ), m_widthOfBackGround -r_vyska, AnMJ); break; } } void KNutAnalog::paintValueOfPointer ( QPainter *p, double value) { qDebug("KNutAnalog::paintValueOfPointer"); QString cislo; cislo.sprintf( "%5.1f",value); cislo=cislo.trimmed(); if (value < m_bottomLimit) value=m_bottomLimit; else { if (value > m_topLimit) value = m_topLimit; } /* nakresleni rucicky*/ // uhel = ((uhel_zobrazeni/(horni_mez-dolni_mez))*(value-dolni_mez))*((-1)*smer)+m_startAngle; p->setPen(m_textColor); p->setFont(m_textFont); QFontMetrics fm = p->fontMetrics(); int r_vyska = fm.height()/ 2; switch (m_typeOfView) { case 1 : p->drawText( m_centerX - fm.width(cislo)/2, 75 + r_vyska , cislo); break; case 2 : p->drawText( m_centerX , 57 + r_vyska , cislo); break; case 3 : p->drawText( 5, m_widthOfBackGround -r_vyska, cislo); break; } } #include "knutanalog.moc" knc105/src/knutprefdlg.h0000644000175000017500000002101011436653645013441 0ustar dandan/*************************************************************************** knutprefdlg.h - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel.Prynych@alo.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTPREFDLG_H #define KNUTPREFDLG_H #include "knutnewupsdlg.h" #include "knutupsdata.h" #include "knutvardata.h" #include "knutconst.h" #include #include #include #include #include #include #include #include #include class QLabel; class QFont; class QCheckBox; class QRadioButton; class QSpinBox; /** *@author Daniel Prynych */ /** * This class makes configure dialog * Tato trida je vytvari konfiguracni dialog. * @author Daniel Prynych * @short Konfiguracni dialog * @version 0.9 */ class KNutPrefDlg : public KPageDialog { Q_OBJECT public: enum changePref { ChangeCountCols = 0x1, //1, ChangeCustomBColor = 0x2, //2, ChangeMBColor = 0x4, //4, ChangeVoltage = 0x8, // 8, ChangeFrequency = 0x10, // 16, ChangeXFer = 0x20, // 32, ChangeUpsSetting = 0x40, // 64, ChangeUpsCount = 0x80, // 128, ChangeMainPanelSetting = 0x100, // 256, ChangeCustomMPanelBColor = 0x200, // 512, ChangeMPBColor = 0x400, // 1024, ChangeAnalogFont = 0x800, // 2048, ChangePanelFont = 0x1000, // 4096, ChangeCustomAPanelBColor = 0x2000, // 8192, ChangeAPBColor = 0x4000, // 16384, ChangeCustomAPanelOColor = 0x8000, // 32768, ChangeAPOColor = 0x10000, // 65536, ChangeCustomKIconColor = 0x20000, // 131072, ChangeKIconBColor = 0x40000, // 262144, ChangeToolTip = 0x80000, // 524288, ChangeTypeOfKIcon = 0x100000, // 1048576 ChangeTypeOfDigProcessing = 0x200000, // 1048576 *2 ChangeSomeThing = 0x400000 // 1048576 *4 }; enum {mainPanelFont = 0, analogPanelFont}; /** * Constructor makes configure dialog. * Konstruktor vytvori konfiguracni dialog. * * @param upsData Is pointer on instance of class of KNutUpsData, which manage informations about UPSes. * @param analogData Is pointer on instance of class of KNutVarData, which manages data about analog panels. * @param settingData Is pointer on struct, which contain values is setted in dialog. * @param upsName Is name of active UPS. * * @param upsData Je odkaz na instanci tridy KNutUpsData, ktera spravuje informace o UPS-kach. * @param analogData Je odkaz na na instanci tridy KNutVarData, ktera spravuje data o analogovych panelech. * @param settingData Je odkaz na strukturu ktera obsahuje hodnoty nastavovane v dialogu. * @param upsName Je jmeno aktivni UPS-ky. * * @since 0.6 **/ KNutPrefDlg(KNutUpsData* const upsData, KNutVarData* const analogData, KNutVarData::SettingDataDef* const settingData, const QString upsName, QWidget* parent = 0); /** * @since 0.3 **/ ~KNutPrefDlg(); signals: /** * Signal is emited when statement is changed same pages. * Signal je aktivovan pokud je zmenen udaj na kterekoliv strance. * * @param changeSetting Declare, what item was changed. * @param changeSetting Udava, ktery prvek byl zmenen. * * @since 0.2 **/ void signalChangeConfig (unsigned int changeSetting ); private slots: /** * @internal */ virtual void slotDefault(); /** * @internal */ virtual void slotApply(); /** * @internal */ virtual void slotOk(); /** * @internal */ void slotChangeSettingFont(int index); /** * @internal */ void slotSetPictureKI (bool on); /** * @internal */ void slotUseCustomBColor(bool enable); /** * @internal */ void slotUseCustomBPanelColor(bool enable); /** * @internal */ void slotUseCustomBAnalogColor(bool enable); /** * @internal */ void slotUseCustomOAnalogColor(bool enable); /** * @internal */ void slotUseCustomBIconColor(bool enable); /** * @internal */ void slotEnableVoltageGroup(bool enable); /** * @internal */ void slotEnableFrequencyGroup(bool enable); /** * @internal */ void slotNewUps(); /** * @internal */ void slotEditUps(); /** * @internal */ void slotDeleteUps(); private: /** * @internal */ void initSetting(); /** * @internal */ void initUps(); /** * @internal */ void initPanel(); /** * @internal */ void initFonts(); /** * @internal */ void initAnalog (); /** * @internal */ void initDock (); /**` * @internal * Sets default setting for selected page of this dialog. */ void setDefaultPage( KPageWidgetItem *page); /**` * @internal * Sets pages of this dialog by setting information */ void setPages( void ); // Private values //Pointers on pages from KPageDialog KPageWidgetItem *mainSettingPage; KPageWidgetItem *upsSettingPage; KPageWidgetItem *panelSettingPage; KPageWidgetItem *fontSettingPage; KPageWidgetItem *analogSettingPage; KPageWidgetItem *dockSettingPage; QString m_activeUpsName; // name of UPS which is active KNutUpsData *m_myUpsData; KNutVarData *m_myAnalogData; KNutVarData::SettingDataDef *m_settingData; KNutNewUpsDlg *newUpsDlg; KListWidget *m_listWidget2; // uses in part UPS, contain name of UPS bool m_checked; //it's settted when, definition(parameters) of UPS were changed // nastaveno kdyz doslo k zmene v definici UPS bool m_checkedActiveUps; //it's setted when, parameters of active UPS were changed // nastaveno pokud doslo ke zmene na aktivni UPS QSpinBox *m_numberOfColumns; KColorButton *m_BGButton; QCheckBox *m_checkBoxCbc; QCheckBox *m_checkBoxAys; QCheckBox *m_checkBoxMesW; KComboBox *m_comboBoxMainWindow; QCheckBox *m_xfer; QCheckBox *m_checkBoxOver; QCheckBox *m_checkBoxBL; QCheckBox *m_checkBoxRB; QCheckBox *m_checkBoxCal; QCheckBox *m_checkBoxMFRM; QCheckBox *m_checkBoxMFR; QCheckBox *m_checkBoxModel; QCheckBox *m_checkBoxSerial; QCheckBox *m_checkBoxFirm; QCheckBox *m_checkBoxRun; QCheckBox *m_checkBoxCbpc; QCheckBox* m_checkBoxCbac; QCheckBox* m_checkBoxCoac; QCheckBox *m_checkBoxCbi; QCheckBox *m_checkBoxTTMFR; QCheckBox *m_checkBoxTTModel; QCheckBox *m_checkBoxTTSerial; QCheckBox *m_checkBoxTTFirm; QCheckBox *m_checkBoxTTRun; QCheckBox *m_checkBoxTTCharge; QCheckBox *m_checkBoxTTLoad; QLabel *m_panelBackgroundColorLabel; QLabel *m_mainBackgroundColorLabel; QLabel *m_analogBackgroundColorLabel; QLabel *m_dockBackgroundColorLabel; QLabel *m_analogPointerColorLabel; QLabel *m_analogOKColorLabel; QLabel *m_analogWarningColorLabel; QLabel *m_analogErrorColorLabel; QLabel *m_analogScaleColorLabel; QLabel *m_analogFontColorLabel; QLabel *m_digitalProcessingLabel; QLabel *m_iconDockLabel; QRadioButton *m_vRadioButton1; QRadioButton *m_vRadioButton2; QRadioButton *m_fRadioButton1; QRadioButton *m_fRadioButton2; QRadioButton *m_iconRadioButton1; QRadioButton *m_iconRadioButton2; KColorButton *m_BGPButton; KColorButton *m_BGAButton; KColorButton *m_AFingerButton; KColorButton *m_AOKButton; KColorButton *m_AWarnningButton; KColorButton *m_AErrorButton; KColorButton *m_AScaleButton; KColorButton *m_AFontButton; KColorButton *m_BGIButton; KComboBox *m_digitalProcesingOfPointers; QGroupBox *m_voltageGroup; QGroupBox *m_frequencyGroup; QCheckBox *m_customFont; // User's font KFontChooser *m_fontWidget; KComboBox *m_panelFonts; // Combo box for select between analog panel a main panel QFont m_aPanelFont; // Analog panel font QFont m_mPanelFont; // Main panel font int m_settingFont; // which font is setted (selected) // QPixmap m_panelPix; // QPixmap m_mSetPix; // QPixmap m_upsesPix; // QPixmap m_analogPix; // QPixmap m_dockPix; }; #endif knc105/src/knutprefdlg.cpp0000644000175000017500000012560511436653645014013 0ustar dandan/*************************************************************************** knutprefdlg.cpp - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel.Prynych@alo.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutprefdlg.h" #include "knutvardata.h" #include "knutfrontpanel.h" #include "knutdock.h" #include #include #include #include #include #include #include #include #include #include #include //#include KNutPrefDlg::KNutPrefDlg(KNutUpsData* const upsData, KNutVarData* const analogData, KNutVarData::SettingDataDef* const settingData, const QString upsName, QWidget* parent) :KPageDialog( parent ), m_activeUpsName (upsName), m_myUpsData(upsData), m_myAnalogData(analogData), m_settingData(settingData) { setAttribute(Qt::WA_DeleteOnClose,false); setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Help | KDialog::Default | KDialog::Apply ); setModal(true); setFaceType(List); setCaption (i18n("Preferences")); m_checked = false; // no change of definition of UPS // neni zadna zmena na definici UPS m_checkedActiveUps = false; // change of active UPS hasn't been made // neni provedena zmena aktivni UPS mainSettingPage =0; upsSettingPage = 0; panelSettingPage = 0; fontSettingPage = 0; analogSettingPage = 0; dockSettingPage = 0 ; initSetting(); initUps(); initPanel(); initFonts(); initAnalog(); initDock(); // from 0.8 version showButtonSeparator(true); enableButtonApply( true ); setHelp("knutclient-configuration","knutclient"); connect (this,SIGNAL(defaultClicked(void)),this,SLOT(slotDefault(void))); connect (this,SIGNAL(okClicked(void)),this,SLOT(slotOk(void))); connect (this,SIGNAL(applyClicked(void)),this,SLOT(slotApply(void))); setPages(); } KNutPrefDlg::~KNutPrefDlg(){ delete m_listWidget2; } /*********************************************************************************************/ /* */ /* PRIVATE SLOTS */ /* */ /*********************************************************************************************/ void KNutPrefDlg::slotSetPictureKI (bool on) { if (!on) { m_checkBoxCbi->setEnabled(true); m_iconDockLabel->setEnabled(true); m_BGIButton->setEnabled(m_checkBoxCbi->isChecked()); m_dockBackgroundColorLabel->setEnabled(m_checkBoxCbi->isChecked()); } else { m_checkBoxCbi->setEnabled(false); m_iconDockLabel->setEnabled(false); m_BGIButton->setEnabled(false); m_dockBackgroundColorLabel->setEnabled(false); } } void KNutPrefDlg::slotEnableVoltageGroup(bool enable) { m_voltageGroup->setEnabled(!enable); } void KNutPrefDlg::slotEnableFrequencyGroup(bool enable) { m_frequencyGroup->setEnabled(!enable); } void KNutPrefDlg::slotUseCustomBColor(bool enable) { m_BGButton->setEnabled(enable); m_mainBackgroundColorLabel->setEnabled(enable); } void KNutPrefDlg::slotUseCustomBIconColor(bool enable) { m_BGIButton->setEnabled(enable); m_dockBackgroundColorLabel->setEnabled(enable); } void KNutPrefDlg::slotUseCustomBPanelColor(bool enable) { m_BGPButton->setEnabled(enable); m_panelBackgroundColorLabel->setEnabled(enable); } void KNutPrefDlg::slotUseCustomBAnalogColor(bool enable) { m_BGAButton->setEnabled(enable); m_analogBackgroundColorLabel->setEnabled(enable); } void KNutPrefDlg::slotUseCustomOAnalogColor(bool enable) { m_AFingerButton->setEnabled(enable); m_AOKButton->setEnabled(enable); m_AWarnningButton->setEnabled(enable); m_AErrorButton->setEnabled(enable); m_AScaleButton->setEnabled(enable); m_AFontButton->setEnabled(enable); m_analogPointerColorLabel->setEnabled(enable); m_analogOKColorLabel->setEnabled(enable); m_analogWarningColorLabel->setEnabled(enable); m_analogErrorColorLabel->setEnabled(enable); m_analogScaleColorLabel->setEnabled(enable); m_analogFontColorLabel->setEnabled(enable); } void KNutPrefDlg::slotChangeSettingFont(int index) { if (m_settingFont != index) { // vybirame jiny font if (m_settingFont == mainPanelFont) { m_mPanelFont=m_fontWidget->font(); m_fontWidget->setFont(m_aPanelFont); } else { m_aPanelFont=m_fontWidget->font(); m_fontWidget->setFont(m_mPanelFont); } m_settingFont = index; } } void KNutPrefDlg::slotDeleteUps() { if (m_listWidget2->currentRow() != -1) { // smazeme policko int ukListWidget = m_listWidget2->currentRow(); if ( m_activeUpsName == m_listWidget2->currentItem()->text() ) m_checkedActiveUps = true; m_myUpsData->deleteName(ukListWidget); m_listWidget2->takeItem(ukListWidget); m_checked = true; // when active ups is deleted, will set checkedActiveUps // pokud smazeme aktivni UPS nastavime checkedActiveUps } } void KNutPrefDlg::slotEditUps() { if (m_listWidget2->currentRow() != -1) { KNutUpsData::upsRecordDef upsRecord; // makes dialog newUpsDlg = new KNutNewUpsDlg(m_myUpsData,m_myAnalogData,false); // reads record m_myUpsData->get(m_listWidget2->currentRow(),upsRecord); // sets parameters for edit / nastavime parametry pro edit newUpsDlg->putData(upsRecord); int result = newUpsDlg->exec(); if (result == Accepted) { // adds into list after OK will be clicked // reads data from form upsRecord = newUpsDlg->getData(); // corrects data in list m_myUpsData->put(m_listWidget2->currentRow(),upsRecord); // corrects data in window m_listWidget2->currentItem()->setText(upsRecord.name); m_checked = true; // if active UPS is changed, will set checkedActiveUps // pokud zmenime aktivni UPS nastavime checkedActiveUps if ( m_activeUpsName == m_listWidget2->currentItem()->text() ) m_checkedActiveUps = true; } delete newUpsDlg; } } void KNutPrefDlg::slotNewUps () { KNutUpsData::upsRecordDef upsRecord; // Zalozime novou UPS // add new UPS newUpsDlg = new KNutNewUpsDlg(m_myUpsData,m_myAnalogData); int result = newUpsDlg->exec(); if (result == Accepted) { // adds into list, when OK is pressed //reads data from form upsRecord = newUpsDlg->getData(); //pridame data do zaznamu //adds data to record m_myUpsData->add(upsRecord); //adds data to window // pridame data do okenka m_listWidget2->addItem(upsRecord.name); // pokud pridame prvni prekreslime hlavni okno // when adds the first sameone, will repaint window m_checked = true; if (m_myUpsData->getCount() ==1 ) m_checkedActiveUps = true; } delete newUpsDlg; } void KNutPrefDlg::slotOk() { slotApply (); accept(); } void KNutPrefDlg::slotApply() { // budeme emitovat signal podle toho co se deje // will emit signal about situation unsigned int changeSetting = 0; // MainPage if (m_settingData->countCols != m_numberOfColumns->value()) { changeSetting += ChangeCountCols; // nastavime pocet sloupcu m_settingData->countCols = m_numberOfColumns->value(); // nastavime pocet sloupcu } if (m_settingData->customBColor != m_checkBoxCbc->isChecked()) { m_settingData->customBColor = m_checkBoxCbc->isChecked(); changeSetting += ChangeCustomBColor; } if (m_settingData->mainBackgroundColor != m_BGButton->color()) { changeSetting += ChangeMBColor; m_settingData->mainBackgroundColor = m_BGButton->color(); // nastavime barvu pozadi } // ovlivnuje jen ukonceni programu, neurcujeme type ChangeSetting if (m_settingData->areYouSure != m_checkBoxAys->isChecked()) { m_settingData->areYouSure = m_checkBoxAys->isChecked(); changeSetting = changeSetting | ChangeSomeThing; } //for next start only if (m_comboBoxMainWindow->currentIndex() != (int)m_settingData->useMainWindow) { m_settingData->useMainWindow = (knc::mainWindowStartVariant)m_comboBoxMainWindow->currentIndex(); changeSetting = changeSetting | ChangeSomeThing; } // if (m_prefData->useMainWindow != m_checkBoxMW->isChecked()) { // m_prefData->useMainWindow = m_checkBoxMW->isChecked(); // changeSetting = changeSetting | ChangeSomeThing; // } //for next start only if (m_settingData->useMessageWindow != m_checkBoxMesW->isChecked()) { m_settingData->useMessageWindow = m_checkBoxMesW->isChecked(); changeSetting = changeSetting | ChangeSomeThing; } //for next start only if (m_settingData->useMessageWindow != m_checkBoxMesW->isChecked()) { m_settingData->useMessageWindow = m_checkBoxMesW->isChecked(); changeSetting = changeSetting | ChangeSomeThing; } int newInputVoltage, newInputFrequency; if ( m_vRadioButton1->isChecked()) newInputVoltage = 230; else newInputVoltage = 120; if ( m_fRadioButton1->isChecked()) newInputFrequency = 50; else newInputFrequency = 60; if (m_settingData->inputVoltage != newInputVoltage) { m_settingData->inputVoltage = newInputVoltage; changeSetting += ChangeVoltage; } if (m_settingData->inputFrequency != newInputFrequency) { m_settingData->inputFrequency = newInputFrequency; changeSetting += ChangeFrequency; } if (m_settingData->lowHighXfer != m_xfer->isChecked()) changeSetting += ChangeXFer; m_settingData->lowHighXfer = m_xfer->isChecked(); //Ups page if ( m_checkedActiveUps ) { // zmena aktivni UPS //change of active UPS or add the first UPS, because the first UPS is active always changeSetting += ChangeUpsSetting; } else { if (m_checked) changeSetting += ChangeUpsCount; } // panel Page unsigned int prefPanelFlags = 3; if (m_checkBoxOver->isChecked()) prefPanelFlags += KNutFrontPanel::PBOver; if (m_checkBoxBL->isChecked()) prefPanelFlags += KNutFrontPanel::PBBattLow; if (m_checkBoxRB->isChecked()) prefPanelFlags += KNutFrontPanel::PBRepBatt; if (m_checkBoxCal->isChecked()) prefPanelFlags += KNutFrontPanel::PBCal; if (m_checkBoxMFRM->isChecked()) prefPanelFlags += KNutFrontPanel::PBMFRMod; if (m_checkBoxMFR->isChecked()) prefPanelFlags += KNutFrontPanel::PBMFR; if (m_checkBoxModel->isChecked()) prefPanelFlags += KNutFrontPanel::PBModel; if (m_checkBoxSerial->isChecked()) prefPanelFlags += KNutFrontPanel::PBSerial; if (m_checkBoxFirm->isChecked()) prefPanelFlags += KNutFrontPanel::PBFirm; if (m_checkBoxRun->isChecked()) prefPanelFlags += KNutFrontPanel::PBRun; if (m_settingData->panelFlags != prefPanelFlags) { m_settingData->panelFlags = prefPanelFlags; changeSetting += ChangeMainPanelSetting; } if (m_settingData->customBPanelColor != m_checkBoxCbpc->isChecked()) { m_settingData->customBPanelColor = m_checkBoxCbpc->isChecked(); changeSetting += ChangeCustomMPanelBColor; } if (m_settingData->mPanelBackgroundColor != m_BGPButton->color()) { changeSetting += ChangeMPBColor; m_settingData->mPanelBackgroundColor = m_BGPButton->color(); // sets color of background } // font Page: unsigned int changeFonts; changeFonts =0; if (m_settingFont == mainPanelFont) m_mPanelFont=m_fontWidget->font(); else m_aPanelFont=m_fontWidget->font(); if ( m_customFont->isChecked() != m_settingData->customFont) { // zmena typy fontu systemove <-> uzivatelske m_settingData->customFont = m_customFont->isChecked(); if (m_settingData->customFont) { // prejdeme na uzivatelske fonty m_settingData->aPanelFont = m_aPanelFont; m_settingData->mPanelFont = m_mPanelFont; changeSetting += ChangeAnalogFont; changeSetting += ChangePanelFont; } else { // pouzijeme systemove fonty changeSetting += ChangeAnalogFont; changeSetting += ChangePanelFont; } } else { if ( m_settingData->customFont ) { // otestujeme zda se zmenili nase fonty if (m_aPanelFont != m_settingData->aPanelFont) { m_settingData->aPanelFont = m_aPanelFont; changeSetting += ChangeAnalogFont; } if (m_mPanelFont != m_settingData->mPanelFont) { m_settingData->mPanelFont = m_mPanelFont; changeSetting += ChangePanelFont; } } } // analog page if (m_settingData->customBAnalogColor != m_checkBoxCbac->isChecked()) { m_settingData->customBAnalogColor = m_checkBoxCbac->isChecked(); changeSetting += ChangeCustomAPanelBColor; } if (m_settingData->aPanelBackgroundColor != m_BGAButton->color()) { changeSetting += ChangeAPBColor; m_settingData->aPanelBackgroundColor = m_BGAButton->color(); // nastavime barvu pozadi } if (m_settingData->customOAnalogColor != m_checkBoxCoac->isChecked()) { m_settingData->customOAnalogColor = m_checkBoxCoac->isChecked(); changeSetting += ChangeCustomAPanelOColor; } if ((m_settingData->analogFingerColor != m_AFingerButton->color()) || (m_settingData->analogOKColor != m_AOKButton->color()) || (m_settingData->analogWarnningColor != m_AWarnningButton->color()) || (m_settingData->analogErrorColor != m_AErrorButton->color()) || (m_settingData->analogScaleColor != m_AScaleButton->color()) || (m_settingData->analogFontColor != m_AFontButton->color())) { changeSetting += ChangeAPOColor; m_settingData->analogFingerColor = m_AFingerButton->color(); // sets color of pointers-- nastavime barvu rucicky m_settingData->analogOKColor = m_AOKButton->color(); // sets color of OK -- nastavime barvu ok m_settingData->analogWarnningColor = m_AWarnningButton->color(); // nastavime barvu varovano m_settingData->analogErrorColor = m_AErrorButton->color(); // nastavime barvu chyby m_settingData->analogScaleColor = m_AScaleButton->color(); // nastavime barvu stupnice m_settingData->analogFontColor = m_AFontButton->color(); // nastavime barvu textu } if (m_settingData->typeDigitalProcessing != m_digitalProcesingOfPointers->currentIndex()) { m_settingData->typeDigitalProcessing = m_digitalProcesingOfPointers->currentIndex(); changeSetting += ChangeTypeOfDigProcessing; } // Kicker /SysTray/ Icon page int stateKIcon; if (m_iconRadioButton1->isChecked()) stateKIcon = KNutDock::pictureKI; else stateKIcon = KNutDock::generalKI; if (m_settingData->typeOfKIcon != stateKIcon) { if (m_iconRadioButton1->isChecked()) m_settingData->typeOfKIcon = KNutDock::pictureKI; if (m_iconRadioButton2->isChecked()) m_settingData->typeOfKIcon = KNutDock::generalKI; changeSetting += ChangeTypeOfKIcon; } if (m_settingData->customKIconColor != m_checkBoxCbi->isChecked()) { m_settingData->customKIconColor = m_checkBoxCbi->isChecked(); changeSetting += ChangeCustomKIconColor; } if (m_settingData->kIconBackgroundColor != m_BGIButton->color()) { changeSetting += ChangeKIconBColor; m_settingData->kIconBackgroundColor = m_BGIButton->color(); // nastavime barvu pozadi } unsigned int prefToolTipFlags = 0; if (m_checkBoxTTMFR->isChecked()) prefToolTipFlags += KNutDock::TTMFR; if (m_checkBoxTTModel->isChecked()) prefToolTipFlags += KNutDock::TTModel; if (m_checkBoxTTSerial->isChecked()) prefToolTipFlags += KNutDock::TTSerial; if (m_checkBoxTTFirm->isChecked()) prefToolTipFlags += KNutDock::TTFirm; if (m_checkBoxTTRun->isChecked()) prefToolTipFlags += KNutDock::TTRun; if (m_checkBoxTTCharge->isChecked()) prefToolTipFlags += KNutDock::TTCharge; if (m_checkBoxTTLoad->isChecked()) prefToolTipFlags += KNutDock::TTLoad; if (m_settingData->toolTipDockFlags != prefToolTipFlags) { m_settingData->toolTipDockFlags = prefToolTipFlags; changeSetting += ChangeToolTip; } if (changeSetting) emit signalChangeConfig( changeSetting ); } void KNutPrefDlg::slotDefault() { qDebug ("KNutPrefDlg::slotDefault()"); setDefaultPage (currentPage()); } /*********************************************************************************************/ /* */ /* PRIVATE FUNCTIONS */ /* */ /*********************************************************************************************/ void KNutPrefDlg::setPages( void ) { //mainPage m_numberOfColumns->setValue(m_settingData->countCols); m_BGButton->setColor(m_settingData->mainBackgroundColor); // sets color of background m_checkBoxAys->setChecked(m_settingData->areYouSure); m_checkBoxMesW->setChecked(m_settingData->useMessageWindow); m_comboBoxMainWindow->setCurrentIndex(m_settingData->useMainWindow); if (m_settingData->inputVoltage == 230) m_vRadioButton1->setChecked( true ); else m_vRadioButton2->setChecked( true ); if (m_settingData->inputFrequency == 50) m_fRadioButton1->setChecked( true ); else m_fRadioButton2->setChecked( true ); m_xfer->setChecked(m_settingData->lowHighXfer); m_voltageGroup->setEnabled(!m_settingData->lowHighXfer); m_frequencyGroup->setEnabled(!m_settingData->lowHighXfer); m_checkBoxCbc->setChecked(m_settingData->customBColor); m_BGButton->setColor(m_settingData->mainBackgroundColor); m_BGButton->setEnabled(m_settingData->customBColor); m_mainBackgroundColorLabel->setEnabled(m_settingData->customBColor); //upsPage // sets listbox for (int i=0; i < m_myUpsData->getCount (); i++) m_listWidget2->addItem (m_myUpsData->getName(i)); //panelPage m_checkBoxOver->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBOver); m_checkBoxBL->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBBattLow); m_checkBoxRB->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBRepBatt); m_checkBoxCal->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBCal); m_checkBoxMFRM->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBMFRMod); m_checkBoxMFR->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBMFR); m_checkBoxModel->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBModel); m_checkBoxSerial->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBSerial); m_checkBoxFirm->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBFirm); m_checkBoxRun->setChecked((m_settingData->panelFlags) & KNutFrontPanel::PBRun); m_checkBoxCbpc->setChecked(m_settingData->customBPanelColor); m_BGPButton->setColor(m_settingData->mPanelBackgroundColor); m_BGPButton->setEnabled(m_settingData->customBPanelColor); m_panelBackgroundColorLabel->setEnabled(m_settingData->customBPanelColor); m_panelBackgroundColorLabel->setEnabled(m_settingData->customBPanelColor); // font page m_customFont->setChecked(m_settingData->customFont); m_aPanelFont = m_settingData->aPanelFont; m_mPanelFont = m_settingData->mPanelFont; m_settingFont = mainPanelFont; // sets font for Main Panel / nastavujeme font pro Main Panel m_fontWidget->setFont(m_mPanelFont); m_fontWidget->setEnabled(m_settingData->customFont); // analog page m_checkBoxCbac->setChecked(m_settingData->customBAnalogColor); m_checkBoxCoac->setChecked(m_settingData->customOAnalogColor); m_BGAButton->setColor(m_settingData->aPanelBackgroundColor); m_BGAButton->setEnabled(m_settingData->customBAnalogColor); m_AFingerButton->setColor(m_settingData->analogFingerColor); m_AFingerButton->setEnabled(m_settingData->customOAnalogColor); m_AOKButton->setColor(m_settingData->analogOKColor); m_AOKButton->setEnabled(m_settingData->customOAnalogColor); m_AWarnningButton->setColor(m_settingData->analogWarnningColor); m_AWarnningButton->setEnabled(m_settingData->customOAnalogColor); m_AErrorButton->setColor(m_settingData->analogErrorColor); m_AErrorButton->setEnabled(m_settingData->customOAnalogColor); m_AScaleButton->setColor(m_settingData->analogScaleColor); m_AScaleButton->setEnabled(m_settingData->customOAnalogColor); m_AFontButton->setColor(m_settingData->analogFontColor); m_AFontButton->setEnabled(m_settingData->customOAnalogColor); m_analogBackgroundColorLabel->setEnabled(m_settingData->customBAnalogColor); m_analogPointerColorLabel->setEnabled(m_settingData->customOAnalogColor); m_analogOKColorLabel->setEnabled(m_settingData->customOAnalogColor); m_analogWarningColorLabel->setEnabled(m_settingData->customOAnalogColor); m_analogErrorColorLabel->setEnabled(m_settingData->customOAnalogColor); m_analogScaleColorLabel->setEnabled(m_settingData->customOAnalogColor); m_analogFontColorLabel->setEnabled(m_settingData->customOAnalogColor); m_digitalProcesingOfPointers->setCurrentIndex(m_settingData->typeDigitalProcessing); // dock page m_checkBoxTTMFR->setChecked((m_settingData->toolTipDockFlags) & KNutDock::TTMFR); m_checkBoxTTModel->setChecked((m_settingData->toolTipDockFlags) & KNutDock::TTModel); m_checkBoxTTSerial->setChecked((m_settingData->toolTipDockFlags) & KNutDock::TTSerial); m_checkBoxTTFirm->setChecked((m_settingData->toolTipDockFlags) & KNutDock::TTFirm); m_checkBoxTTRun->setChecked((m_settingData->toolTipDockFlags) & KNutDock::TTRun); m_checkBoxTTCharge->setChecked((m_settingData->toolTipDockFlags) & KNutDock::TTCharge); m_checkBoxTTLoad->setChecked((m_settingData->toolTipDockFlags) & KNutDock::TTLoad); m_checkBoxCbi->setChecked(m_settingData->customKIconColor); m_BGIButton->setColor(m_settingData->kIconBackgroundColor); if (m_settingData->typeOfKIcon == KNutDock::pictureKI) { m_iconRadioButton1->setChecked( true ); m_iconDockLabel->setEnabled(false); m_checkBoxCbi->setEnabled(false); m_BGIButton->setEnabled(false); m_dockBackgroundColorLabel->setEnabled(false); } if (m_settingData->typeOfKIcon == KNutDock::generalKI) { m_iconRadioButton2->setChecked( true ); m_iconDockLabel->setEnabled(true); m_BGIButton->setEnabled(true); m_BGIButton->setEnabled(m_settingData->customKIconColor); m_dockBackgroundColorLabel->setEnabled(m_settingData->customKIconColor); } } void KNutPrefDlg::setDefaultPage( KPageWidgetItem *page) { qDebug ("KNutPrefDlg::setDefaultPage()"); if (page == mainSettingPage) { qDebug ("KNutPrefDlg::slotDefault() -- mainSettingPage"); m_numberOfColumns->setValue( knc::DefaultCountCols ); m_checkBoxCbc->setChecked(false); m_mainBackgroundColorLabel->setEnabled(false); m_BGButton->setEnabled(false); m_BGButton->setColor(knc::defaultBGColor); m_checkBoxAys->setChecked ( false ); m_checkBoxMesW->setChecked ( false ); m_comboBoxMainWindow->setCurrentIndex(knc::mw_no); // sets NO m_vRadioButton1->setChecked( true ); m_fRadioButton1->setChecked( true ); m_xfer->setChecked( false ); m_voltageGroup->setEnabled(true); m_frequencyGroup->setEnabled(true); } if (page == panelSettingPage) { qDebug ("KNutPrefDlg::slotDefault() -- panelSettingPage"); m_checkBoxOver->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBOver); m_checkBoxBL->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBBattLow); m_checkBoxRB->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBRepBatt); m_checkBoxCal->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBCal); m_checkBoxMFRM->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBMFRMod); m_checkBoxMFR->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBMFR); m_checkBoxModel->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBModel); m_checkBoxSerial->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBSerial); m_checkBoxFirm->setChecked(KNutFrontPanel::DefaultPanelFlags & KNutFrontPanel::PBFirm); m_checkBoxCbpc->setChecked(false); m_panelBackgroundColorLabel->setEnabled(false); m_BGPButton->setColor(knc::defaultBGColor); m_BGPButton->setEnabled(false); } if (page == fontSettingPage) { qDebug ("KNutPrefDlg::slotDefault() -- fontSettingPage"); m_customFont->setChecked(false); m_panelFonts->setEnabled(false); m_fontWidget->setEnabled(false); } if (page == analogSettingPage) { qDebug ("KNutPrefDlg::slotDefault() -- analogSettingPage"); m_checkBoxCbac->setChecked(false); m_BGAButton->setColor(knc::defaultBGColor); m_BGAButton->setEnabled(false); m_checkBoxCoac->setChecked(false); m_AFingerButton->setColor(knc::defaultFingerColor); m_AFingerButton->setEnabled(false); m_AOKButton->setColor(knc::defaultOkColor); m_AOKButton->setEnabled(false); m_AWarnningButton->setColor(knc::defaultWarnningColor); m_AWarnningButton->setEnabled(false); m_AErrorButton->setColor(knc::defaultErrorColor); m_AErrorButton->setEnabled(false); m_AScaleButton->setColor(knc::defaultScaleColor); m_AScaleButton->setEnabled(false); m_AFontButton->setColor(knc::defaultFontColor); m_AFontButton->setEnabled(false); m_analogBackgroundColorLabel->setEnabled(false); m_analogPointerColorLabel->setEnabled(false); m_analogOKColorLabel->setEnabled(false); m_analogWarningColorLabel->setEnabled(false); m_analogErrorColorLabel->setEnabled(false); m_analogScaleColorLabel->setEnabled(false); m_analogFontColorLabel->setEnabled(false); m_digitalProcesingOfPointers->setCurrentIndex(0); } if (page == dockSettingPage) { qDebug ("KNutPrefDlg::slotDefault() -- dockSettingPage"); m_checkBoxCbi->setChecked(false); m_BGAButton->setColor(knc::defaultKIconColor); m_checkBoxTTMFR->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTMFR); m_checkBoxTTModel->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTModel); m_checkBoxTTSerial->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTSerial); m_checkBoxTTFirm->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTFirm); m_checkBoxTTRun->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTRun); m_checkBoxTTCharge->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTCharge); m_checkBoxTTLoad->setChecked(KNutDock::DefaultToolTipFlags & KNutDock::TTLoad); m_iconRadioButton1->setChecked( true ); } } void KNutPrefDlg::initSetting () { //KStandardDirs *mdirs; //mdirs = kapp->sessionConfig()->componentData().dirs(); //QString dirStr=mdirs->findResource("appicon","knc_mset.png"); //qDebug(dirStr.toAscii().constData()); //QStringList mstrl = mdirs->resourceDirs("appicon"); // QStringListIterator javaStyleIterator(mstrl); // while (javaStyleIterator.hasNext()) // std::cout << javaStyleIterator.next().toLocal8Bit().constData() << std::endl; // KIconLoader *loader = KIconLoader::global(); // m_mSetPix = loader->loadIcon("knc_mset.png", KIconLoader::User); QFrame *mainPageWidget = new QFrame; mainSettingPage = new KPageWidgetItem (mainPageWidget,i18n("Setting")); mainSettingPage->setHeader (i18n("Main Setting")); mainSettingPage->setIcon(KIcon(UserIcon("knc_mset.png"))); addPage(mainSettingPage); QVBoxLayout *topLayout = new QVBoxLayout( mainPageWidget ); QGridLayout *dataLayout = new QGridLayout(); QLabel *initSettingLabel1 = new QLabel(i18n("Number of columns :"),mainPageWidget); m_numberOfColumns = new QSpinBox(mainPageWidget); m_numberOfColumns->setMinimum(knc::MinCols); m_numberOfColumns->setMaximum(knc::MaxCols); QLabel *initSettingLabel2 = new QLabel(i18n("Use custom background color"),mainPageWidget); m_checkBoxCbc = new QCheckBox ("",mainPageWidget); m_mainBackgroundColorLabel = new QLabel(i18n("Color of background :"),mainPageWidget); m_BGButton = new KColorButton (mainPageWidget); QLabel *initSettingLabel4 = new QLabel(i18n("Use dialog \"Are you sure\""),mainPageWidget); m_checkBoxAys = new QCheckBox ("",mainPageWidget); QLabel *initSettingLabel5 = new QLabel(i18n("Use Main window when program is started"),mainPageWidget); m_comboBoxMainWindow = new KComboBox (mainPageWidget); m_comboBoxMainWindow->addItem (i18n("Yes")); m_comboBoxMainWindow->addItem (i18n("No")); m_comboBoxMainWindow->addItem (i18n("Auto")); QLabel *initSettingLabel6 = new QLabel(i18n("Show message window, when program reports error"),mainPageWidget); m_checkBoxMesW = new QCheckBox ("",mainPageWidget); dataLayout->addWidget (initSettingLabel1,0,0); dataLayout->addWidget (m_numberOfColumns,0,1); dataLayout->addWidget (initSettingLabel2,1,0); dataLayout->addWidget (m_checkBoxCbc,1,1); dataLayout->addWidget (m_mainBackgroundColorLabel,2,0); dataLayout->addWidget (m_BGButton,2,1); dataLayout->addWidget (initSettingLabel4,3,0); dataLayout->addWidget (m_checkBoxAys,3,1); dataLayout->addWidget (initSettingLabel5,4,0); dataLayout->addWidget (m_comboBoxMainWindow,4,1); dataLayout->addWidget (initSettingLabel6,5,0); dataLayout->addWidget (m_checkBoxMesW,5,1); topLayout->addLayout(dataLayout); QGroupBox *VFGroup = new QGroupBox(i18n("Voltage/Frequency"),mainPageWidget); QGridLayout *setVoltFreqLayout = new QGridLayout (VFGroup ); m_voltageGroup = new QGroupBox(i18n("Nominal Input Voltage"),VFGroup); QGridLayout *voltLayout = new QGridLayout (m_voltageGroup ); m_vRadioButton1 = new QRadioButton(i18n("&230 V"), m_voltageGroup ); m_vRadioButton2 = new QRadioButton(i18n("&120 V"), m_voltageGroup ); voltLayout->addWidget ( m_vRadioButton1,1,0 ); voltLayout->addWidget ( m_vRadioButton2,2,0 ); m_frequencyGroup = new QGroupBox(i18n("Nominal Input Frequency"),VFGroup); QGridLayout *freqLayout = new QGridLayout (m_frequencyGroup ); m_fRadioButton1 = new QRadioButton(i18n("&50 Hz"), m_frequencyGroup); m_fRadioButton2 = new QRadioButton(i18n("&60 Hz"), m_frequencyGroup); freqLayout->addWidget ( m_fRadioButton1,1,0 ); freqLayout->addWidget ( m_fRadioButton2,2,0 ); m_xfer = new QCheckBox (i18n("&Use High-Low input.transfer values"),VFGroup); setVoltFreqLayout->addWidget ( m_voltageGroup,1,0 ); setVoltFreqLayout->addWidget ( m_frequencyGroup,1,1 ); setVoltFreqLayout->addWidget ( m_xfer,2,0 ); topLayout->addWidget (VFGroup,10); topLayout->addStretch( 20 ); connect (m_xfer,SIGNAL(toggled(bool)),this,SLOT( slotEnableVoltageGroup(bool))); connect (m_xfer,SIGNAL(toggled(bool)),this,SLOT( slotEnableFrequencyGroup(bool))); connect (m_checkBoxCbc,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomBColor(bool))); setDefaultPage(mainSettingPage); } void KNutPrefDlg::initUps () { QFrame *mainPageWidget = new QFrame; upsSettingPage = new KPageWidgetItem (mainPageWidget,i18n("UPS")); upsSettingPage->setHeader (i18n("UPS Setting")); upsSettingPage->setIcon(KIcon(UserIcon("knc_upses.png"))); addPage(upsSettingPage); QHBoxLayout *topLayout = new QHBoxLayout( mainPageWidget ); // makes box for names of UPS's / Vytvorime box pro jmena UPS-ek m_listWidget2 = new KListWidget( mainPageWidget ); m_listWidget2->setSizePolicy( QSizePolicy( (QSizePolicy::Policy)5 ,(QSizePolicy::Policy)5 )); m_listWidget2->setFrameShape( QListWidget::StyledPanel ); m_listWidget2->setFrameShadow( QListWidget::Sunken ); m_listWidget2->setMinimumSize (100,100); //includes listbox into horizontal layout on the first place topLayout->addWidget( m_listWidget2, 20 ); // makes vertical layout and includes it in horizontal layout into the second place //QVBoxLayout *upsLayout = new QVBoxLayout( topLayout ); QVBoxLayout *upsLayout = new QVBoxLayout(); topLayout->addLayout(upsLayout); // vytvorime tlacitka KPushButton *newButton = new KPushButton (i18n("&Add"),mainPageWidget); KPushButton *editButton = new KPushButton (i18n("&Edit"),mainPageWidget); KPushButton *deleteButton = new KPushButton (i18n("&Delete"),mainPageWidget); // includes buttons into layout / vlozime tlacitka do layoutu upsLayout->addWidget( newButton ); upsLayout->addWidget( editButton ); upsLayout->addWidget( deleteButton ); upsLayout->addStretch( 10 ); connect (newButton,SIGNAL(clicked()),this,SLOT(slotNewUps())); connect (editButton,SIGNAL(clicked()),this,SLOT(slotEditUps())); connect (deleteButton,SIGNAL(clicked()),this,SLOT(slotDeleteUps())); connect (m_listWidget2,SIGNAL(doubleClicked(QListWidgetItem *,const QPoint &)),this,SLOT(slotEditUps())); setDefaultPage(upsSettingPage); } void KNutPrefDlg::initDock () { QFrame *mainPageWidget = new QFrame; dockSettingPage = new KPageWidgetItem (mainPageWidget,i18n("Dock bar")); dockSettingPage->setHeader (i18n("Docking Setting")); dockSettingPage->setIcon(KIcon(UserIcon("knc_dock.png"))); addPage(dockSettingPage); QVBoxLayout *topLayout = new QVBoxLayout( mainPageWidget ); QGroupBox *typeGroup = new QGroupBox(i18n("Type of dock's showing"),mainPageWidget); QGridLayout *typeLayout = new QGridLayout (typeGroup); topLayout->addWidget(typeGroup); QGroupBox *infoBox = new QGroupBox (i18n("Items of tooltip"),mainPageWidget); QGridLayout *infoLayout = new QGridLayout (infoBox); topLayout->addWidget(infoBox); QGridLayout *colorLayout = new QGridLayout (); topLayout->addLayout(colorLayout); m_iconRadioButton1 = new QRadioButton(i18n("&Picture"), typeGroup ); m_iconRadioButton2 = new QRadioButton(i18n("&General"), typeGroup ); m_checkBoxTTMFR = new QCheckBox (i18n("M&anufacturer"),infoBox); m_checkBoxTTModel = new QCheckBox (i18n("M&odel"),infoBox); m_checkBoxTTSerial = new QCheckBox (i18n("&Serial"),infoBox); m_checkBoxTTFirm = new QCheckBox (i18n("&Firm. rev."),infoBox); m_checkBoxTTRun = new QCheckBox (i18n("&Runtime"),infoBox); m_checkBoxTTCharge = new QCheckBox (i18n("&Battery Charge"),infoBox); m_checkBoxTTLoad = new QCheckBox (i18n("&UPS Load"),infoBox); m_iconDockLabel = new QLabel(i18n("Use custom icon's background color"),mainPageWidget); m_checkBoxCbi = new QCheckBox ("",mainPageWidget); m_dockBackgroundColorLabel = new QLabel(i18n("Color of icon's background :"),mainPageWidget); m_BGIButton = new KColorButton (mainPageWidget); // typeLayout->addRowSpacing (0 ,fontMetrics().lineSpacing() ); typeLayout->addWidget ( m_iconRadioButton1,1,0 ); typeLayout->addWidget ( m_iconRadioButton2,2,0 ); // infoLayout->addRowSpacing (0 ,fontMetrics().lineSpacing() ); infoLayout->addWidget ( m_checkBoxTTMFR ,1,0); infoLayout->addWidget ( m_checkBoxTTModel ,2,0); infoLayout->addWidget ( m_checkBoxTTSerial ,3,0); infoLayout->addWidget ( m_checkBoxTTFirm ,4,0); infoLayout->addWidget ( m_checkBoxTTRun ,5,0); infoLayout->addWidget ( m_checkBoxTTCharge ,6,0); infoLayout->addWidget ( m_checkBoxTTLoad ,7,0); colorLayout->addWidget (m_iconDockLabel,0,0); colorLayout->addWidget (m_checkBoxCbi,0,1); colorLayout->addWidget (m_dockBackgroundColorLabel,1,0); colorLayout->addWidget (m_BGIButton,1,1); topLayout->addStretch( 20 ); connect (m_checkBoxCbi,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomBIconColor(bool))); connect (m_iconRadioButton1,SIGNAL(toggled(bool)),this,SLOT(slotSetPictureKI(bool))); setDefaultPage(dockSettingPage); } void KNutPrefDlg::initPanel () { QFrame *mainPageWidget = new QFrame; panelSettingPage = new KPageWidgetItem (mainPageWidget,i18n("Panel")); panelSettingPage->setHeader (i18n("Panel Setting")); panelSettingPage->setIcon(KIcon(UserIcon("knc_panel.png"))); addPage(panelSettingPage); QVBoxLayout *topLayout = new QVBoxLayout( mainPageWidget ); QGroupBox *infoBox = new QGroupBox (mainPageWidget); QGridLayout *infoLayout = new QGridLayout (infoBox); topLayout->addWidget(infoBox); QGridLayout *colorLayout = new QGridLayout (); topLayout->addLayout(colorLayout); // vytvorime widgety - Nazev Zatrhavaci box //makes widgets - name checkbox m_checkBoxOver = new QCheckBox (i18n("UPS &Overload"),infoBox); m_checkBoxBL = new QCheckBox (i18n("UPS &Battery low"),infoBox); m_checkBoxRB = new QCheckBox (i18n("R&eplace battery"),infoBox); m_checkBoxCal = new QCheckBox (i18n("Ups &calibration"),infoBox); m_checkBoxMFRM = new QCheckBox (i18n("&Manufac. + Model"),infoBox); m_checkBoxMFR = new QCheckBox (i18n("M&anufacturer"),infoBox); m_checkBoxModel = new QCheckBox (i18n("M&odel"),infoBox); m_checkBoxSerial = new QCheckBox (i18n("&Serial"),infoBox); m_checkBoxFirm = new QCheckBox (i18n("&Firm. rev."),infoBox); m_checkBoxRun = new QCheckBox (i18n("&Runtime"),infoBox); QLabel *initPanelLabel1 = new QLabel(i18n("Use custom background color"),mainPageWidget); m_checkBoxCbpc = new QCheckBox ("",mainPageWidget); m_panelBackgroundColorLabel = new QLabel(i18n("Color of background :"),mainPageWidget); m_BGPButton = new KColorButton (mainPageWidget); // includes widgets infoLayout->addWidget ( m_checkBoxOver, 0,0); infoLayout->addWidget ( m_checkBoxBL ,1,0); infoLayout->addWidget ( m_checkBoxRB ,2,0); infoLayout->addWidget ( m_checkBoxCal ,3,0); infoLayout->addWidget ( m_checkBoxMFRM ,4,0); infoLayout->addWidget ( m_checkBoxMFR ,5,0); infoLayout->addWidget ( m_checkBoxModel ,6,0); infoLayout->addWidget ( m_checkBoxSerial ,7,0); infoLayout->addWidget ( m_checkBoxFirm ,8,0); infoLayout->addWidget ( m_checkBoxRun ,9,0); colorLayout->addWidget (initPanelLabel1,0,0); colorLayout->addWidget (m_checkBoxCbpc,0,1); colorLayout->addWidget (m_panelBackgroundColorLabel,1,0); colorLayout->addWidget (m_BGPButton,1,1); topLayout->addStretch( 20 ); connect (m_checkBoxCbpc,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomBPanelColor(bool))); setDefaultPage(panelSettingPage); } void KNutPrefDlg::initFonts () { QFrame *mainPageWidget = new QFrame; fontSettingPage = new KPageWidgetItem (mainPageWidget,i18n("Fonts")); fontSettingPage->setHeader (i18n("Setting Fonts")); fontSettingPage->setIcon(KIcon(DesktopIcon("fontforge"))); addPage(fontSettingPage); QVBoxLayout *topLayout = new QVBoxLayout( mainPageWidget ); QHBoxLayout *setSysLayout = new QHBoxLayout(); m_customFont = new QCheckBox (i18n("&Use custom font"),mainPageWidget); setSysLayout->addWidget ( m_customFont ,10); setSysLayout->addStretch( 10 ); topLayout->addLayout(setSysLayout); QHBoxLayout *setTypeLayout = new QHBoxLayout(); m_panelFonts = new KComboBox(mainPageWidget); m_panelFonts->addItem (i18n("Main panel")); m_panelFonts->addItem (i18n("Analog panels")); setTypeLayout->addWidget ( m_panelFonts ,0); topLayout->addLayout(setTypeLayout); QHBoxLayout *setFontLayout = new QHBoxLayout(); QStringList fontsList; KFontChooser::getFontList(fontsList, KFontChooser::SmoothScalableFonts); m_fontWidget = new KFontChooser(mainPageWidget, false, fontsList); setFontLayout->addWidget (m_fontWidget ,0); topLayout->addLayout(setFontLayout); topLayout->addStretch( 20 ); connect (m_panelFonts,SIGNAL(activated(int)),this,SLOT(slotChangeSettingFont(int))); connect (m_customFont,SIGNAL(toggled(bool)),m_fontWidget,SLOT(setEnabled(bool))); connect (m_customFont,SIGNAL(toggled(bool)),m_panelFonts,SLOT(setEnabled(bool))); setDefaultPage(fontSettingPage); } void KNutPrefDlg::initAnalog () { QFrame *mainPageWidget = new QFrame; analogSettingPage = new KPageWidgetItem (mainPageWidget,i18n("Analog")); analogSettingPage->setHeader (i18n("Setting Analog panel")); analogSettingPage->setIcon(KIcon(UserIcon("knc_analog.png"))); addPage(analogSettingPage); QVBoxLayout *topLayout = new QVBoxLayout( mainPageWidget ); QGridLayout *setColorLayout = new QGridLayout(); topLayout->addLayout(setColorLayout); topLayout->addStretch( 20 ); QLabel *initAnalogLabel1 = new QLabel(i18n("Use custom background color"),mainPageWidget); m_checkBoxCbac = new QCheckBox ("",mainPageWidget); m_analogBackgroundColorLabel = new QLabel(i18n("Color of background :"),mainPageWidget); m_BGAButton = new KColorButton (mainPageWidget); QLabel *initAnalogLabel12 = new QLabel(i18n("Use custom other colors"),mainPageWidget); m_checkBoxCoac = new QCheckBox ("",mainPageWidget); m_analogPointerColorLabel = new QLabel(i18n("Color of pointer :"),mainPageWidget); m_AFingerButton = new KColorButton (mainPageWidget); m_analogOKColorLabel = new QLabel(i18n("Color of OK range :"),mainPageWidget); m_AOKButton = new KColorButton (mainPageWidget); m_analogWarningColorLabel = new QLabel(i18n("Color of warning range :"),mainPageWidget); m_AWarnningButton = new KColorButton (mainPageWidget); m_analogErrorColorLabel= new QLabel(i18n("Color of error range :"),mainPageWidget); m_AErrorButton = new KColorButton (mainPageWidget); m_analogScaleColorLabel = new QLabel(i18n("Color of scale :"),mainPageWidget); m_AScaleButton = new KColorButton (mainPageWidget); m_analogFontColorLabel = new QLabel(i18n("Color of font :"),mainPageWidget); m_AFontButton = new KColorButton (mainPageWidget); m_digitalProcessingLabel = new QLabel(i18n("Digital processing of pointers :"),mainPageWidget); m_digitalProcesingOfPointers = new KComboBox (mainPageWidget); setColorLayout->addWidget ( initAnalogLabel1, 0,0); setColorLayout->addWidget ( m_checkBoxCbac ,0,1); setColorLayout->addWidget ( m_analogBackgroundColorLabel, 1,0); setColorLayout->addWidget ( m_BGAButton ,1,1); setColorLayout->addWidget ( initAnalogLabel12, 2,0); setColorLayout->addWidget ( m_checkBoxCoac ,2,1); setColorLayout->addWidget ( m_analogPointerColorLabel, 3,0); setColorLayout->addWidget ( m_AFingerButton ,3,1); setColorLayout->addWidget ( m_analogOKColorLabel, 4,0); setColorLayout->addWidget ( m_AOKButton ,4,1); setColorLayout->addWidget ( m_analogWarningColorLabel, 5,0); setColorLayout->addWidget ( m_AWarnningButton ,5,1); setColorLayout->addWidget ( m_analogErrorColorLabel, 6,0); setColorLayout->addWidget ( m_AErrorButton ,6,1); setColorLayout->addWidget ( m_analogScaleColorLabel, 7,0); setColorLayout->addWidget ( m_AScaleButton ,7,1); setColorLayout->addWidget ( m_analogFontColorLabel, 8,0); setColorLayout->addWidget ( m_AFontButton ,8,1); setColorLayout->addWidget ( m_digitalProcessingLabel, 9,0); setColorLayout->addWidget ( m_digitalProcesingOfPointers, 9,1); m_digitalProcesingOfPointers->addItem(i18n("Nothing processing")); m_digitalProcesingOfPointers->addItem(i18n("Fast antialiasing")); m_digitalProcesingOfPointers->addItem(i18n("Fine antialiasing")); m_digitalProcesingOfPointers->addItem(i18n("Fast antialiasing and blur motion")); m_digitalProcesingOfPointers->addItem(i18n("Fine antialiasing and blur motion")); topLayout->addStretch( 20 ); connect (m_checkBoxCbac,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomBAnalogColor(bool))); connect (m_checkBoxCoac,SIGNAL(toggled(bool)),this,SLOT(slotUseCustomOAnalogColor(bool))); setDefaultPage(analogSettingPage); } #include "knutprefdlg.moc" knc105/src/knutvardata.h0000644000175000017500000001436411436653645013456 0ustar dandan/*************************************************************************** knutvardata.h - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTVARDATA_H #define KNUTVARDATA_H #include "knutnet.h" #include "knutupsdata.h" #include "knutconst.h" #include #include #include /** *@author Daniel Prynych */ /** * Class contains data about analog panels, * name, ... * Describes view of panel. * Trida obsahuje data o analogovych panelech, * nazev, atd. * Popisuje jak ma prislusny panel vypadat * * @author Daniel Prynych * @short Information about analog panels * @version 0.4 **/ class QString; class KNutVarData { public: struct ScaleStructDef { int start; int end; int scaleColor; }; struct SettingDataDef { int countCols; QColor mainBackgroundColor; QColor mPanelBackgroundColor; QColor aPanelBackgroundColor; QColor analogFingerColor; QColor analogOKColor; QColor analogWarnningColor; QColor analogErrorColor; QColor analogScaleColor; QColor analogFontColor; unsigned int panelFlags; int inputVoltage; int inputFrequency; bool lowHighXfer; bool areYouSure; knc::mainWindowStartVariant useMainWindow; int useMessageWindow; bool customBColor; bool customBPanelColor; bool customBAnalogColor; bool customOAnalogColor; QFont mPanelFont; // main panel font QFont aPanelFont; // analog panel font QFont systemFont; // system font bool customFont; // use custom font bool useDescription; unsigned int toolTipDockFlags; bool customKIconColor; QColor kIconBackgroundColor; int typeOfKIcon; int typeDigitalProcessing; bool activatedMainWindow; }; struct upsInfoDef{ //include generally informations about active (selected) UPS KNutNet* upsNet; // pointer to instance of KNutNet KNutUpsData::upsRecordDef record; // include information about information of ups (name, address, login, password ...) int netError; // kod chyby pri spojeni // kode if error of connection bool errorUpsData; // state of connection to usbd, this isn't state of knutnet knc::upsDriverConnection upsDriverState; // defined in knutconst.h int oldState; // code of lost state of UPS kod posledniho stavu UPS QString name; QString password; KNutNet::nutVarVersion nutVariables; int nutProtocol; QString runtimeVar; QString lowxferVar; QString highxferVar; QString statusVar; QString upsLoadVar; bool reconnecting; // is true when program is in reconnecting stage int reconnectCount; }; struct VarStrucDef { QString nameAnalog; // jmeno promene v meraku napr. UPS Load QString nameUnit; // merna jednotka napr % int typeAnalog; //typ meraku int numberItem; //pocet casti stupnice neni v souvislosti barvou int numberInItem; //pocet casti stupnice uvnitr dilku stupnice int start; // pocatecni hodnota v meraku int end; // konecna hodnota v meraku struct ScaleStructDef scaleStruct[5]; }; KNutVarData(); ~KNutVarData(); /** * Gets data of analog measure panel, type of measure panel, * Vrati data analogoveho mericiho panelu. * typ meraku, pocet dilku stupnice, merici jedntotku atd * data je mozno take nastavovat * @param seqNumber Kod typu meraky. * @return Data pro zadany typ panelu. * @since 0.1 **/ VarStrucDef getData (const int seqNumber) const; /** * Puts data of analog measure panel * Nastavi data analogoveho mericiho panelu. * * @param seqNumber Kod typu meraky. * @param data Data pro zadany typ panelu. * * @since 0.1 **/ void putData (const int seqNumber, VarStrucDef& varStruc); /** * Sets data of analog measure panel for input and output voltage * Nastavi data analogoveho mericiho panelu pro vstupni a vystupni napeti. * * @param typeVoltage Typ vstupniho napeti 230/120. * * @since 0.1 **/ void setVoltage (const int typeVoltage); /** * Sets data of analog measure panel for input frequence * Nastavi data analogoveho mericiho panelu pro vstupni frekvence. * * @param typeFrequence Typ vstupni frekvence 50/60. * * @since 0.1 **/ void setFrequency (const int typeFrequence); /** * Nastavi vnitrni cast vybarveni podle low/high xfer, * low/high-XFER udava rozpeti pri kterem UPS zpracovava napeti ze site. * * @param lowXfer Pocatecni hodnota. * @param highXfer Konecna hodnota. * @since 0.1 **/ void setXfer (const float lowXfer, const float highXfer); /** * Vrati dlouhy nazev analogoveho panelu, * je to jmeno merene veliciny * * @param seqNumber Kod typu merakuss. * @since 0.1 **/ QString getNameAnalogData (const int seqNumber); /** * Translates code of ups variable to its text value * * @since 0.2 **/ static const QString nameUpsVar (const int i, const KNutNet::nutVarVersion varVersion ); /** * Prevede kod chyby na jeho textovou reprezentaci * * @since 0.2 **/ static const QString errorToText (const int error); private: enum {aRegWhite,aRegGreen,aRegYellow,aRegRed,aRegBlue,aRegCyan,aRegMagenta,aRegBlack}; VarStrucDef m_dataVar[ knc::NumberOfTypes ]; /* udrzuje popis Anagovych meraku pro danou promenou jmeno zabarveni typ meraky */ VarStrucDef m_dataVarVoltage[2]; VarStrucDef m_dataVarFrequence[2]; static const int U230V = 0; static const int U120V = 1; static const int F50HZ = 0; static const int F60HZ = 1; QString m_upsVarNameAnalog[ knc::NumberOfTypes ];//array of strings - includes name of analog meters }; #endif knc105/src/knutdock.h0000755000175000017500000003010311436653645012744 0ustar dandan/*************************************************************************** knutdock.h - description ------------------- begin : t zari 23 2003 copyright : (C) 2003 by Daniel Prynych email : Daniel@Prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTDOCK_H #define KNUTDOCK_H #include "knutupsdata.h" #include "knutvardata.h" #include "knutconst.h" #include #include #include #include #include #include class QAction; class QString; class QImage; class QColor; class QBrush; /** * This class makes icons in dock. * Tato trida zajistuje vytvoreni icony v docku. * * @author Daniel Prynych * @short Dock's icons * @version 0.3 */ class KNutDock : public KSystemTrayIcon { Q_OBJECT public: enum KNTDconst { DefaultToolTipFlags = 0x398}; enum upsConnection { idle, // ups isn't connected connecting, // ups is connecting ok, // ups is connected error // error of connecting }; enum eTypeOfIcons { pictureKI = 0, generalKI}; enum toolTipItems { TTMFR = 0x8, // 8, // FRM TTModel = 0x10, // 16, // Model TTSerial = 0x20, // 32, // Serial TTFirm = 0x40, //64, // Firmware Revision TTRun = 0x80,// 128, // Runtime TTCharge = 0x100, // 256, // Charge TTLoad = 0x200 // 512 // Load }; /** * Constructor - makes icon in dockbar. * Konstruktor - vytvori iconu v docku. * * @param activeUpsInfo pointer to structure upsInfo * @param settingData pointer to structure type of SettingDataDef * @param upsRecord pointer to class tActiveUpsInfo * @param parent is ignored * @param activeUpsInfo odkaz na structuru upsInfo * @param settingData odkaz na strukturu typu SettingDataDef * @param upsRecord odkaz na instanci tridy tActiveUpsInfo * @param upsRecord pointer to class tActiveUpsInfo * @param parent je ignorovan * @since 0.3 * Constructor calls parent constructor with parametr NULL because it * uses own working of signal activated because in parent class signal activated is connected to activatedOrHide, * but procedure activatedOrHide doesn't work when parent object is 0 / NULL. * **/ KNutDock(KNutVarData::upsInfoDef* activeUpsInfo, KNutVarData::SettingDataDef* settingData, KNutUpsData* upsRecords, QWidget* parent=0); /** * Destruktor. * * @since 0.1.2 **/ ~KNutDock(); /** * Nastavi zakladni nastaveni pro dock. * Sets basic setting for dock. * * @since 0.1 **/ void clearDockValues(void); /** * Vytvori menu (seznam) UPS. * Makes menu (list) of UPS. * * @since 0.1 **/ void changeUps(void); /** * Zmeni styl/typ icon * Changes style/type of icon * * @since 0.1 **/ void changeKIcon (void); /** * Zmeni pozadi icony v kickeru * Changes background of icon in kicker * * @since 0.2 **/ void changeKIBColor(void); /** * Zmeni prvky v tooltip-u * Changes items in toolTip * * @since 0.1 **/ void changeToolTip(void); /** * Provede nove zpracovani dat a jejich nakresli iconu docku, interni repaint je volan vzdy. * Tato funkce take vola funkci ToolTip. * Makes new processing of data and paints icons of dock, internal repaint is colled always. * This function calls function ToolTips too. * @param always Kdyz je true prorovede vykresleni vzdy, kde je false provede vykresleni jen kdyz je zmenena nejaka hodnota UPS. * @param always When param is true, icon is made always, is one is false icon is makeing when same UPS's value is changed. * * @since 0.4 **/ void repaintDock ( const bool always = false); /** * Nastavi v Menu oznaceni pro aktivni UPS. * Sets mark for active UPS in menu. * * @since 0.1 **/ void setNewUPS(void); signals: /**This signal is emited when end of application was selected in menu. * Tento signal je vyslan pokud bylo vybrano v menu ukonceni aplikace. * * * @since 0.1 **/ void endApplication(void); /** * Tento signal je vyslan pokud bylo vybrano v menu minimalizace aplikace. * Tento signal is emited when minimize application was selected in menu. * * * @since 0.1 **/ void minimize(void); /** * Tento signal je vyslan pokud bylo vybrano v menu polozka preferences. * This signal is emited when item preferences was selected in menu. * * @since 0.1 **/ void preferences(void); /** * Tento signal je vyslan pokud byla vybrana activace hlavniho okna (Main Window). * * @since 0.1 **/ void activeMainWindow(void); /** * Tento signal je vyslan pokud bylo vybrano zobrazeni promennych; * This signal is emited when showing values was selected. * * @since 0.1 **/ void printUPSVars(void); /** * Tento signal je vyslan pokud bylo vybrano provedeni okamziteho prikazu; * This signal is emited when running instant command was selected. * * @since 0.1 **/ void instComms(void); /** * Tento signal je vyslan pokud bylo vybrana zmena RW promennych. * This signal is emited when change of RW values was selected. * * @since 0.1 **/ void RWVars(void); /** * Tento signal je vyslan pokud bylo vybrana zmena RW promennych. * This signal is emited when refresh connection was selected * * @since 0.1 **/ void makeRefreshConnection(void); /** * Tento signal je vyslan pokud je vybrana nova UPS; * This signal is emited when new UPS is selected * * @since 0.1 **/ void UPSChanged(QString name); protected: /** * @internal * * Tests event and calls menu and main window, when lefy or right mouse button is pressed * @since 0.1 **/ // bool event( QEvent * ); private slots: /** * @internal * Vola proceduru KAboutApplication, zobrazi informace o teto aplikaci a KDE. * Calls procedure KAboutApplication, shows informations about this application and KDE. * * @since 0.1 **/ void slotShowMyAbout(); void slotActivated ( QSystemTrayIcon::ActivationReason reason ); void slotExitApplication (void); /** * @internal * Vysle signal minimize. * Sends signal minimize. * * @since 0.1 **/ void slotMinimize (void); /** * @internal * Vysle signal peferences. * Sends signal preferences. * * @since 0.1 **/ void slotPreferences (void); /** * @internal * Vysle signal printUPSVars. * Sends signal printUPSVars. * * @since 0.1 **/ void slotPrintUPSVars(void); /** * @internal * Vysle signal instComms. * Sends signal instComms. * * @since 0.1 **/ void slotInstComms(void); /** * @internal * Vysle signal RWVars. * Sends signal RWVars. * * @since 0.1 **/ void slotRWVars(void); /** * @internal * Vysle signal upsName * Sends signal upsName. * * @since 0.1 **/ void slotUpsName(QAction *); /** * @internal * Vysle signal makeRefreshConnection * Sends signal makeRefreshConnection. * * @since 0.1 **/ void slotRefreshConnection(void); protected: /** * @internal * Nastavi vse pro vykresleni zakladni ikony. * Tato ikona je kreslena dokud neni navazano spojeni * Sets all for painting of basic icon. * This icon is painted * * @since 0.2 **/ void initSysTrayImage(void); void setIconBackgroundLayer (void); void loadIcons(void); void loadImages(void); /** * @internal * Sets tooltip. * Nastavi ToolTip. * * @since 0.1 **/ void toolTip (int runtime, int status, int batteryCharge, int upsLoad ); /** * @internal * Vytvori a hlavni menu panelu. * Makes a main menu of panel * * @since 0.1 **/ void createMainMenu(void); /** * @internal * Vytvori a podmenu pro seznam UPS-ek. * Makes a submenu for list ig UPSes. * * @since 0.1 **/ void createUpsMenu(void); /** * @internal * Paints a numbers. * Vykresli cisla. * @param number je hodnota cisla. * @param x je leva souradnice cisla * @param y je horni souradnice cisla * @param p je ukazatel na painter * * @since 0.2 **/ void paintNumbers (int numbers, int x, int y, QPainter* p ); //x,y levy horni roh cisla 1 /** * @internal * Paints a number * Vykresli cislici. * @param number je hodnota cislice. * @param x je leva souradnice cislice * @param y je horni souradnice cislice * @param p je ukazatel na painter * * @since 0.1 **/ void paintNumber (int x, int y, int number, QPainter *p); /** * @internal * Paints a char. * Vykresli znak. * @param x je leva souradnice cislice * @param y je horni souradnice cislice * @param p je ukazatel na painter * @param char je vykreslovany znak. * * @since 0.1 **/ void paintChar (int x, int y, char LCDChar, QPainter *p); /** * @internal * Vykresli pomlcku. * @param x je leva souradnice pomlcky * @param y je horni souradnice pomlcky * @param p je ukazatel na painter * * @since 0.1 **/ void paintDash (int x, int y, QPainter *p); /** * @internal * Paints runtime layer. * Vykresli vrstvu runtime. * * @since 0.1 **/ void paintRuntime (QPainter &paint, int runtime, int status); /** * @internal * Paints UPS Load for GI * Vykresli UPS Load pro GI. * * @since 0.2 **/ void paintLoadGeneralKI (QPainter &paint, int load ); /** * @internal * Paints Battery Charge for type general icon. * Vykresli Battery Charge pro obecny typ icony * * @since 0.1 **/ void paintChargeGeneralKI (QPainter &paint,int charge ); /** * @internal * Paints Battery Charge for type picture icon. This procedure is used for offline state only. * Vykresli Battery Charge pro obrazkovy typ icony Procedure je pouzita jen ve stavu offline. * * @since 0.1 **/ void paintChargePictureKI (QPainter &paint,int charge ); /** * @internal * Paints layer for UPS Status, only for type general * Vykresli vrstvu pro UPS Status. * * @since 0.2 **/ void paintStatus (QPainter &paint, int status ); // void paintEvent (QPaintEvent *); /** * @internal * Makes sysTray icon for ok state / online or offline variant/ * @since 0.1 **/ void makeOkIcon(void); /** * @internal * Tests if value od variables for makeing systray icon was changed * @since 0.1 **/ bool dataValueIsChanged(void); /** * @internal * Paints green point into main layer, only for type picture. * Vykresli do hlavni vrstvy zeleny bod. * Ma vyznam jen pro typ picture. * * @since 0.3 **/ void paintErrorPoint ( QPainter& paint ); /** * @internal * Paints red point into main layer, only for type picture. * Vykresli do hlavni vrstvy cerveny bod. * Ma vyznam jen pro typ picture. * * @since 0.3 **/ void paintOKPoint ( QPainter& paint ); /** * @internal * Clean internal variables this class. * Vycisti interni promene teto tridy. * * @since 0.1 **/ void clearValues(void); KNutUpsData* m_upsRecords; KNutVarData::SettingDataDef* m_settingData; // v teto strukture jsou ulozeny promene ktere nastavuji konfiguraci KNutVarData::upsInfoDef* m_activeUpsInfo; // values for selected ups KIcon m_errorIcon; KIcon m_connectionIcon; KIcon m_idleIcon; QImage m_upsPix; QImage m_battPix; KMenu* m_menu; KMenu* m_upsServerMenu; QImage *m_mainLayer; QImage *m_backgroundLayer; int m_runtimeValue; int m_upsLoadValue; int m_batteryChargeValue; int m_statusValue; int m_statusBatValue; int m_statusWarningValue; upsConnection m_dataOk; // selects one from four type of icons's view //idle, connecting, connected, error upsConnection m_dataOkOld; int m_typeOfIcon; unsigned int m_toolTipFlags; QBrush m_backgroundBrush; QBrush m_backgroundGlobalBrush; QBrush m_textBrush; QColor m_textColor; }; #endif knc105/src/knutfrontpanel.cpp0000644000175000017500000004636711436653645014547 0ustar dandan/*************************************************************************** knutfrontpanel.cpp - description ------------------- begin : Tue Aug 21 2001 copyright : (C) 2001 by Daniel Prynych email : Daniel at prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "knutfrontpanel.h" #include "knutvardata.h" #include #include #include #include #include #include #include #include #include #include #include #include #include KNutFrontPanel::KNutFrontPanel( const QPalette panelPalette, const QFont panelFonts, QWidget *parent, const unsigned int flags) : QFrame( parent), m_panelFlags(flags),m_palette (panelPalette) { m_upsOkColor = Qt::green; m_upsErrorColor = Qt::red; m_upsBackColor = Qt::white; //backgroundColor(); m_helpColor = Qt::black; m_typeOfLCDColor=true; m_LCDNumber1 = 0; this->setFrameStyle( QFrame::Box | QFrame::Raised ); this->setLineWidth( 2 ); m_panelFont = panelFonts; // sets font / our selected font m_panelBoldFont = panelFonts; // will be changed later m_panelBoldFont.setBold (TRUE); m_panelFont.setBold (FALSE); // sets no bold m_mainLayout = new QVBoxLayout(this); m_mainLayout->setMargin ( 10 ); m_mainLayout->setSpacing ( 10 ); // layer for bulbs m_bulbsGroupBox = new QGroupBox(this); m_mainLayout->addWidget(m_bulbsGroupBox); QVBoxLayout* bulbsLayout = new QVBoxLayout(m_bulbsGroupBox); bulbsLayout->setMargin( 5 ); m_textLabel1 = new QLabel( i18n("UPS On line"),m_bulbsGroupBox); m_frameOL = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); m_frameOL->setMaximumSize(30,30); m_frameOL->setMinimumSize(25,25); m_textLabel1->setToolTip(m_textLabel1->text()); QHBoxLayout* OLLayout = new QHBoxLayout; OLLayout->addWidget(m_textLabel1); OLLayout->addSpacing(10); OLLayout->addWidget(m_frameOL); OLLayout->setMargin (3); OLLayout->setStretchFactor(m_textLabel1,20); OLLayout->setStretchFactor(m_frameOL,5); m_textLabel2 = new QLabel( i18n("UPS On battery"), m_bulbsGroupBox); m_frameOB = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); m_frameOB->setMaximumSize(30,30); m_frameOB->setMinimumSize(25,25); m_textLabel2->setToolTip(m_textLabel2->text()); bulbsLayout->addLayout(OLLayout); QHBoxLayout* OBLayout = new QHBoxLayout; OBLayout->addWidget(m_textLabel2); OBLayout->addSpacing(10); OBLayout->addWidget(m_frameOB); OBLayout->setMargin (3); OBLayout->setStretchFactor(m_textLabel2,20); OBLayout->setStretchFactor(m_frameOB,5); bulbsLayout->addLayout(OBLayout); m_textLabel3 = new QLabel( i18n("UPS Overload"), m_bulbsGroupBox); m_frameOVER = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); m_frameOVER->setMaximumSize(30,30); m_frameOVER->setMinimumSize(25,25); m_textLabel3->setToolTip(m_textLabel3->text()); m_OLayout = new QHBoxLayout(); m_OLayout->addWidget(m_textLabel3); m_OLayout->addSpacing(10); m_OLayout->addWidget(m_frameOVER); m_OLayout->setMargin (3); m_OLayout->setStretchFactor(m_textLabel3,20); m_OLayout->setStretchFactor(m_frameOVER,5); bulbsLayout->addLayout(m_OLayout); m_textLabel4 = new QLabel( i18n("UPS Battery low"), m_bulbsGroupBox); m_frameLB = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); m_frameLB->setMaximumSize(30,30); m_frameLB->setMinimumSize(25,25); m_textLabel4->setToolTip(m_textLabel4->text()); m_LBLayout = new QHBoxLayout(); m_LBLayout->addWidget(m_textLabel4); m_LBLayout->addSpacing(10); m_LBLayout->addWidget(m_frameLB); m_LBLayout->setMargin (3); m_LBLayout->setStretchFactor(m_textLabel4,20); m_LBLayout->setStretchFactor(m_frameLB,5); bulbsLayout->addLayout(m_LBLayout); m_textLabel5 = new QLabel( i18n("Replace battery"), m_bulbsGroupBox); m_frameRB = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); m_frameRB->setMaximumSize(30,30); m_frameRB->setMinimumSize(25,25); m_textLabel5->setToolTip(m_textLabel5->text()); m_RBLayout = new QHBoxLayout(); m_RBLayout->addWidget(m_textLabel5); m_RBLayout->addSpacing(10); m_RBLayout->addWidget(m_frameRB); m_RBLayout->setMargin (3); m_RBLayout->setStretchFactor(m_textLabel5,20); m_RBLayout->setStretchFactor(m_frameRB,5); bulbsLayout->addLayout(m_RBLayout); m_textLabel6 = new QLabel( i18n("UPS calibration"), m_bulbsGroupBox); m_frameCAL = new KLed (m_upsBackColor,KLed::Off,KLed::Sunken,KLed::Circular,m_bulbsGroupBox); m_frameCAL->setMaximumSize(30,30); m_frameCAL->setMinimumSize(25,25); m_textLabel6->setToolTip(m_textLabel6->text()); m_CALLayout = new QHBoxLayout(); m_CALLayout->addWidget(m_textLabel6); m_CALLayout->addSpacing(10); m_CALLayout->addWidget(m_frameCAL); m_CALLayout->setMargin (3); m_CALLayout->setStretchFactor(m_textLabel6,20); m_CALLayout->setStretchFactor(m_frameCAL,5); bulbsLayout->addLayout(m_CALLayout); m_messGroupBox = new QGroupBox(this); m_mainLayout->addWidget(m_messGroupBox); QVBoxLayout* messLayout = new QVBoxLayout(m_messGroupBox); messLayout->setMargin( 3 ); m_textLabel7 = new QLabel( "", m_messGroupBox); m_textLabel7->setToolTip(m_textLabel7->text()); m_manufacModelLayout = new QHBoxLayout(); m_manufacModelLayout->addWidget(m_textLabel7); m_manufacModelLayout->setMargin ( 3 ); messLayout->addLayout(m_manufacModelLayout); m_textLabelManufac = new QLabel( i18n("Manufac. : "), m_messGroupBox); m_textLabel8 = new QLabel( "", m_messGroupBox); m_textLabelManufac->setToolTip(m_textLabelManufac->text()); m_manufacLayout = new QHBoxLayout(); m_manufacLayout->addWidget(m_textLabelManufac); m_manufacLayout->addWidget(m_textLabel8); m_manufacLayout->addStretch(20); m_manufacLayout->setMargin ( 3 ); messLayout->addLayout(m_manufacLayout); m_textLabelName = new QLabel( i18n("Name")+" : ", m_messGroupBox); m_textLabel9 = new QLabel( "", m_messGroupBox); m_textLabelName->setToolTip(m_textLabelName->text()); m_nameLayout = new QHBoxLayout(); m_nameLayout->addWidget(m_textLabelName); m_nameLayout->addWidget(m_textLabel9); m_nameLayout->addStretch(20); m_nameLayout->setMargin ( 3 ); messLayout->addLayout(m_nameLayout); m_textLabelSerial = new QLabel( i18n("Serial : "), m_messGroupBox); m_textLabel10 = new QLabel( "", m_messGroupBox); m_textLabelSerial->setToolTip(m_textLabelSerial->text()); m_serialLayout = new QHBoxLayout(); m_serialLayout->addWidget(m_textLabelSerial); m_serialLayout->addWidget(m_textLabel10); m_serialLayout->addStretch(20); m_serialLayout->setMargin ( 3 ); messLayout->addLayout(m_serialLayout); m_textLabelFirm = new QLabel( i18n("Firm. rev. : "), m_messGroupBox); m_textLabel11 = new QLabel( "", m_messGroupBox); m_textLabelFirm->setToolTip(m_textLabelFirm->text()); m_firmLayout = new QHBoxLayout(); m_firmLayout->addWidget(m_textLabelFirm); m_firmLayout->addWidget(m_textLabel11); m_firmLayout->addStretch(20); m_firmLayout->setMargin ( 3 ); messLayout->addLayout(m_firmLayout); m_valGroupBox = new QGroupBox(this); m_mainLayout->addWidget(m_valGroupBox); QVBoxLayout* valLayout = new QVBoxLayout(m_valGroupBox); valLayout->setMargin( 3 ); m_textLabelRun = new QLabel( i18n("Runtime")+" : ", m_valGroupBox); m_textLabelRun->setToolTip(m_textLabelRun->text()); m_LCDNumber1 = new QLCDNumber (5,m_valGroupBox); m_LCDNumber1->setSegmentStyle (QLCDNumber::Flat); m_LCDNumber1->setFrameStyle( QFrame::NoFrame ); m_LCDNumber1->setMinimumSize(50,20); m_runLayout = new QHBoxLayout(); m_runLayout->addWidget(m_textLabelRun); m_runLayout->addStretch(20); m_runLayout->addWidget(m_LCDNumber1); m_runLayout->setMargin ( 5 ); m_mainLayout->addStretch(20); m_mainLayout->addSpacing(5); valLayout->addLayout(m_runLayout); setAutoFillBackground(true); setAllPalettes(); changePanelFont(); paintPanel (); setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Preferred); } KNutFrontPanel::~KNutFrontPanel(){ } //************************************************************ void KNutFrontPanel::paintPanel( void ) { if (m_panelFlags & PBOnLine) { m_textLabel1->show(); m_frameOL->show(); } else { m_textLabel1->hide(); m_frameOL->hide(); } if (m_panelFlags & PBOnBatt) { m_textLabel2->show(); m_frameOB->show(); } else { m_textLabel2->hide(); m_frameOB->hide(); } if (m_panelFlags & PBOver) { m_OLayout->setMargin ( 3 ); m_textLabel3->show(); m_frameOVER->show(); } else { m_textLabel3->hide(); m_frameOVER->hide(); m_OLayout->setMargin ( 0 ); } if (m_panelFlags & PBBattLow) { m_textLabel4->show(); m_frameLB->show(); m_LBLayout->setMargin ( 3 ); } else { m_textLabel4->hide(); m_frameLB->hide(); m_LBLayout->setMargin ( 0 ); } if (m_panelFlags & PBRepBatt) { m_textLabel5->show(); m_frameRB->show(); m_RBLayout->setMargin ( 3 ); } else { m_textLabel5->hide(); m_frameRB->hide(); m_RBLayout->setMargin ( 0 ); } if (m_panelFlags & PBCal) { m_textLabel6->show(); m_frameCAL->show(); m_CALLayout->setMargin ( 3 ); } else { m_textLabel6->hide(); m_frameCAL->hide(); m_CALLayout->setMargin ( 0 ); } if (m_panelFlags & PBMFRMod) { m_textLabel7->show(); m_manufacModelLayout->setMargin ( 5 ); } else { m_textLabel7->hide(); m_manufacModelLayout->setMargin ( 0 ); } if (m_panelFlags & PBMFR) { m_textLabel8->show(); m_textLabelManufac->show(); m_manufacLayout->setMargin ( 5 ); } else { m_textLabel8->hide(); m_textLabelManufac->hide(); m_manufacLayout->setMargin ( 0 ); } if (m_panelFlags & PBModel) { m_textLabel9->show(); m_textLabelName->show(); m_nameLayout->setMargin ( 5 ); } else { m_textLabel9->hide(); m_textLabelName->hide(); m_nameLayout->setMargin ( 0 ); } if (m_panelFlags & PBSerial) { m_textLabel10->show(); m_textLabelSerial->show(); m_serialLayout->setMargin ( 5 ); } else { m_textLabel10->hide(); m_textLabelSerial->hide(); m_serialLayout->setMargin ( 0 ); } if (m_panelFlags & PBFirm) { m_textLabel11->show(); m_textLabelFirm->show(); m_firmLayout->setMargin ( 5 ); } else { m_textLabel11->hide(); m_textLabelFirm->hide(); m_firmLayout->setMargin ( 0 ); } if ( (m_panelFlags & PBMFRMod) || (m_panelFlags & PBMFR) || (m_panelFlags & PBModel) || (m_panelFlags & PBSerial) ||(m_panelFlags & PBFirm)) m_messGroupBox->show(); else m_messGroupBox->hide(); if (m_panelFlags & PBRun) { m_valGroupBox->show(); } else { m_valGroupBox->hide(); } } unsigned int KNutFrontPanel::getPanelFlags( void) { return m_panelFlags; } void KNutFrontPanel::setPanelFlags(const int upsPanelFlags) { m_panelFlags = upsPanelFlags; } void KNutFrontPanel::setAllNameUps(const QString panelUpsAllName ){ m_textLabel7->setText(panelUpsAllName); //QToolTip::remove(m_textLabel7); m_textLabel7->setToolTip(panelUpsAllName); } void KNutFrontPanel::setMFRUps(const QString panelUpsFRM ){ m_textLabel8->setText(panelUpsFRM); //QToolTip::remove(m_textLabelManufac); m_textLabelManufac->setToolTip(m_textLabelManufac->text()+panelUpsFRM); } void KNutFrontPanel::setNameUps(const QString panelUpsName ){ m_textLabel9->setText(panelUpsName); //QToolTip::remove(m_textLabelName); m_textLabelName->setToolTip(m_textLabelName->text()+panelUpsName); } void KNutFrontPanel::setSerialUps(const QString panelUpsSerial ){ m_textLabel10->setText(panelUpsSerial); //QToolTip::remove(m_textLabelSerial); m_textLabelSerial->setToolTip(m_textLabelSerial->text()+panelUpsSerial); } void KNutFrontPanel::setFirmRevUps(const QString upsPanelFormRev ){ m_textLabel11->setText(upsPanelFormRev); //QToolTip::remove(m_textLabelFirm); m_textLabelFirm->setToolTip(m_textLabelFirm->text()+upsPanelFormRev); } void KNutFrontPanel::cleanPanel(void) { m_textLabel7->setText(""); m_textLabel8->setText(""); m_textLabel9->setText(""); m_textLabel10->setText(""); m_textLabel11->setText(""); m_frameOL->setColor(m_upsBackColor); m_frameOL->off(); m_frameOB->setColor(m_upsBackColor); m_frameOB->off(); m_frameOVER->setColor(m_upsBackColor); m_frameOVER->off(); m_frameLB->setColor(m_upsBackColor); m_frameLB->off(); m_frameRB->setColor(m_upsBackColor); m_frameRB->off(); m_frameCAL->setColor(m_upsBackColor); m_frameCAL->off(); m_LCDNumber1->display("-:--"); m_LCDNumber1->setPalette (palette()); } void KNutFrontPanel::setRuntime(const int runtime) { QString runtimeString; if (runtime != knc::numberVarError) { int min = (int)floor(runtime/60); int sec = runtime - (min*60); runtimeString=QString("%1:%2").arg(min,2).arg(sec,2); if (runtimeString[3] == ' ') runtimeString[3]='0'; } else runtimeString="-:--"; m_LCDNumber1->display(runtimeString); } void KNutFrontPanel::setPanel(const int panelBulbs) { // OFF - 1 ups je vypnuta // OL - 2 ups je bezi na sit // OB - 4 ups bezi na baterie // LB - 8 baterie je vybyta (pokud je zaroven OB dojde k shutdownu) // CAL - 16 je spustena calibrace // OVER - 128 ups je pretizena // RB - 256 ups pozaduje vymenu baterie if (!(panelBulbs < 0)) { // ups online /na sit if (panelBulbs & KNutNet::OL) { m_frameOL->setColor(m_upsOkColor); m_frameOL->on(); m_LCDNumber1->setPalette (m_LCDPaletteOk); m_typeOfLCDColor=true; } else { m_frameOL->setColor(m_upsBackColor); m_frameOL->off(); } // ups ofline /na baterie if (panelBulbs & KNutNet::OB) { m_frameOB->setColor(m_upsErrorColor); m_frameOB->on(); m_LCDNumber1->setPalette (m_LCDPaletteErr); m_typeOfLCDColor=false; } else { m_frameOB->setColor(m_upsBackColor); m_frameOB->off(); } if (panelBulbs & KNutNet::LB) { m_frameLB->setColor(m_upsErrorColor); m_frameLB->on(); } else { m_frameLB->setColor(m_upsBackColor); m_frameLB->off(); } if (panelBulbs & KNutNet::OVER) { m_frameOVER->setColor(m_upsErrorColor); m_frameOVER->on(); } else { m_frameOVER->setColor(m_upsBackColor); m_frameOVER->off(); } if (panelBulbs & KNutNet::RB) { m_frameRB->setColor(m_upsErrorColor); m_frameRB->on(); } else { m_frameRB->setColor(m_upsBackColor); m_frameRB->off(); } if (panelBulbs & KNutNet::CAL) { m_frameCAL->setColor(m_upsErrorColor); m_frameCAL->on(); } else { m_frameCAL->setColor(m_upsBackColor); m_frameCAL->off(); } } } /*********************************************************************************************/ /* */ /* PUBLIC SLOTS */ /* */ /*********************************************************************************************/ void KNutFrontPanel::slotSetPanelFont(QFont newPanelFont) { m_panelFont = newPanelFont; // nastavime font m_panelBoldFont = newPanelFont; // pozdeji zmenime m_panelBoldFont.setBold (TRUE); m_panelFont.setBold (FALSE); // Zrusime bold u panelu changePanelFont(); // zmeni pismo paintPanel(); } /*********************************************************************************************/ /* */ /* PRIVATE FUNCTIONS */ /* */ /*********************************************************************************************/ void KNutFrontPanel::setLCDPalette (void) { m_LCDPaletteOk = m_palette; m_LCDPaletteErr = m_palette; m_LCDPaletteOk.setColor(QPalette::Active,QPalette::Foreground,Qt::green); m_LCDPaletteOk.setColor(QPalette::Inactive,QPalette::Foreground,Qt::green); m_LCDPaletteErr.setColor(QPalette::Active,QPalette::Foreground,Qt::red); m_LCDPaletteErr.setColor(QPalette::Inactive,QPalette::Foreground,Qt::red); } void KNutFrontPanel::setPalette (const QPalette & p){ m_palette = p; setAllPalettes(); } void KNutFrontPanel::setAllPalettes (void){ QColor myColor; QFrame::setPalette (m_palette); setLCDPalette(); m_bulbsPalette = m_palette; m_frameOL->setPalette(m_bulbsPalette); // we must correct feature of KLed, KLed repaint background when color of item (function KLed::setColor()) is changed only // when we change palette backround only, KLed ignore this change myColor = m_frameOL->color(); m_frameOL->setColor(m_helpColor); // black is neutral (unprofitable) color for us m_frameOL->setColor(myColor); myColor = m_frameOB->color(); m_frameOB->setColor(m_helpColor); m_frameOB->setColor(myColor); myColor = m_frameLB->color(); m_frameLB->setColor(m_helpColor); m_frameLB->setColor(myColor); myColor = m_frameOVER->color(); m_frameOVER->setColor(m_helpColor); m_frameOVER->setColor(myColor); myColor = m_frameRB->color(); m_frameRB->setColor(m_helpColor); m_frameRB->setColor(myColor); myColor = m_frameCAL->color(); m_frameCAL->setColor(m_helpColor); m_frameCAL->setColor(myColor); if (m_LCDNumber1) { if (m_typeOfLCDColor) m_LCDNumber1->setPalette (m_LCDPaletteOk); else m_LCDNumber1->setPalette (m_LCDPaletteErr); } } void KNutFrontPanel::changePanelFont (void) { m_textLabel1->setFont(m_panelFont); m_textLabel2->setFont(m_panelFont); m_textLabel3->setFont(m_panelFont); m_textLabel4->setFont(m_panelFont); m_textLabel5->setFont(m_panelFont); m_textLabel6->setFont(m_panelFont); m_textLabelManufac->setFont(m_panelFont); m_textLabelName->setFont (m_panelFont); m_textLabelSerial->setFont (m_panelFont); m_textLabelFirm->setFont (m_panelFont); m_textLabelRun->setFont (m_panelFont); m_textLabel7->setFont (m_panelBoldFont); m_textLabel8->setFont (m_panelBoldFont); m_textLabel9->setFont (m_panelBoldFont); m_textLabel10->setFont (m_panelBoldFont); m_textLabel11->setFont (m_panelBoldFont); m_textLabelRun->setFont (m_panelFont); } #include "knutfrontpanel.moc" knc105/src/knutanalog.h0000644000175000017500000002573711436653645013303 0ustar dandan/*************************************************************************** * Copyright (C) 2007 by Daniel Prynych * * Daniel.Prynych@buzuluk.cz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef KNUTANALOG_H #define KNUTANALOG_H #include #include #include // po odladeni smazat #include class QPainter; class QFont; enum speedOfAAlias { none,fast,slow}; /** * This class shows analog measuring panels * * @author Daniel Prynych * @short analog measuring panels * @version 0.2 */ class KNutAnalog : public QFrame { Q_OBJECT public: struct extentOfDyeDef { double start,end; int color; }; /** * Constructor - makes object for analog measuring panel about size 130 x 130 points * Konstruktor - vytvori objekt pro analogovy merici panel o rozmerech 130 x 130 bodu * * When you need paint or repaint panel you have to call function repaint * other functions calls this function theirself, when run = true * Pokud je potreba vykreslit nebo prekreslit panel je nutno zavolat funkci repaint, * ostatni funkce ji zavolaji sami pokud je run = TRUE. * * @param bottomLimit Is bottom value of scale.. * @param topLimit is end value of scale. * @param typeOfView determine type view of scale 1- circle 2- right part of circle, 3 - top part of circle * @param countOfParts determine count of big parts (parents parts) of scale. * @param countOfSubParts determine count small parts (children parts) id scale, evere big part include e few small part. * @param pointerColor determine color of pointer. * @param scaleColor determine color of scale. * @param textColor determine color of text. * @param analogFonts determine fonts for text and scale. * @param qualityOfPainter determine quality painting of pointer- 0 nothing. 1 fast antialiasing, 2 slow antialiasing, 3 blur motion + fast antialiasing, 4 blur motion + slow antialiasing * @since 0.3 **/ KNutAnalog(QWidget *parent = 0, int Astart = 0, int topLimit = 100, int typeOfView = 1, int countOfParts = 5, int countOfSubParts = 0, QColor pointerColor = Qt::black, QColor m_scaleColor = Qt::black, QColor textColor = Qt::black, QFont *analogFonts = 0, int qualityOfPointer = 4 ); /** * Destruktor * @since 0.2 **/ ~KNutAnalog(); /** * Sets text for top and bottom text of panel. * Nastavi text dolni a horni text na panelu. * * @param m_inscription determinuje inscription , bottom text , usually. * @param m_inscription Udava nadpis, "dolni" text, obvykle co je mereno. * @param text_up Udava mernou jednotku "horni" text, obvykle merna jednotka. * * @since 0.3 **/ void setText (const QString &m_inscription, const QString &text_up); /** * Makes whole layer of analog panel. * Vytvori celou vrstvu analogoveho panelu. * * @param repaintBackground = TRUE makes background of analog panel too. * @param repaintBackground = TRUE nakresli take pozadi analogoveho panelu. * * @since 0.1 **/ void paintWholeLayer( const bool repaintBackground = false); /** * Makes background of analog panel. * Vytvori pozadi analogoveho panelu. * * @param run = TRUE makes immediately repaint of panel * @param run = TRUE provede okamzite prekresleni panelu. * * @since 0.3 **/ void makeBackground (const bool run=false); /** * Repaint pointer of analog panel. * Prekresli rucicku analogoveho panelu. * * @since 0.3 **/ void repaintPointer (void ); /** * Nastavuje devet zakladnich barev pro mezikruzi. * Sets nine basic color for circle in scale * * @since 0.3 **/ void setDefaultArcColor(void); /** * Nastavi zakladni barvu pro mezikruzi. * Sets basic color for circle in scale * * @param reg Poradove cislo barvy (barevneho registru). * @param color Barva na kterou bude nastaven registr barvy. * * @since 0.3 **/ void setArcColor(const int reg, const QColor &color ); /** * Vybarvi cast stupnice zadanou barvou. * Nastavi rozsah mezikruzi, podle stupnice od pocatecni hodnoty do koncove hodnoty stupnice * Barevne casti se barvy postupne, podel poradoveho cisla, mohou se prekryvat. * Je mozno nastavit jen 5 casti !! * * @param startOfCircle Urcuje zazatek mezikruzi. * @param endOfCircle Urcuje konec mezikruzi. * @param color Urcuje barvu. * * @since 0.3 **/ void addArc (const double startOfCircle, const double endOfCircle, const int regColor); /** * Clear colors of scale * Zrusi vybarveni stupnice. * * @since 0.2 **/ void delArc (void); /** * * Nastavi rozsah stupnice. * * @param Astart Urcuje pocatecni hodnotu stupnice. * @param AEND Urcuje koncovou hodnotu stupnice. * @param run = TRUE makes immediately repaint of panel * @param run = TRUE provede okamzite prekresleni panelu. * * @since 0.3 */ void setRange (const int Astart = 0, const int Aend = 100, const bool run=false); /** * Sets number of parts od scale * Nastavi pocet dilku stupnice. * * @param Count Determine number of parts of pointer.. * @param Count Urcuje pocet casti stupnice. * @param run = TRUE makes immediately repaint of panel * @param run = TRUE provede okamzite prekresleni panelu. * * @since 0.2 */ void setMember (const int Count, const bool run=false); /** * Sets color of analog pointer. * Nastavi barvu analogove rucicky. * * @param pointerColor determine color of pointer. * @param pointerColor Urcuje barvu rucicky. * @since 0.3 */ void setPointerColor (const QColor &pointerColor); /** * sets color of text; * Nastavi barvu textu. * * @param fontColor determine color of font. * @param fontColor urcuje barvu fontu. * * @since 0.3 */ void setFontColor (const QColor &fontColor ); /** * Sets color of scale * Nastavi barvu stupnice. * * @param scaleColor determine color if scale. * @param scaleColor urcuje barvu stupnice. * * @since 0.3 */ void setScaleColor (const QColor &scaleColor); /** * Sets type of digital processing of pointer. 0 nothing. 1 fast antialiasing, 2 slow antialiasing, 3 blur motion + fast antialiasing, 4 blur motion + slow antialiasing. * * @param qualityOfPointer determine quality of pointer's digital procesing * @param run = TRUE makes immediately repaint of panel * @param run = TRUE provede okamzite prekresleni panelu. * * @since 0.2 */ void setDigitalProcesing (const int qualityOfPointer, const bool run =false ); /** * Sets pointer on value pointerValue. * Posune rucicku na hodnotu pointerValue. * * @param pointerValue Urcuje hodnotu na jakou bude nastavena rucicka. * * @since 0.2 */ void setPointer (const double pointerValue ); /** * Const. determines width of analog panel in points. * Konstanta, udava velikost analogoveho panelu v bodech. * * @since 0.2 */ static const int AnalogWidth = 130; public slots: /** * Sets font of scale, change is doing immediately * Nastavi font stupnice, zmena je provedena okamzite. * * @param newScaleFont Urcuje novy font hodnot stupnice. * @param newScaleFont Urcuje novy font hodnot stupnice. * * @since 0.2 */ void slotSetScaleFont(QFont newScaleFont); /** * Sets font of text. change is doing immediately. * Nastavi font textu, zmena je provedena okamzite. * * @param newTextFont Urcuje novy font pro texty. * * @since 0.2 */ void slotSetTextFont(QFont newTextFont); /** * Nastavi font stupnice a textu, zmena je provedena okamzite. * * @param newTextFont Urcuje novy font pro texty a hodnoty stupnice. * * @since 0.2 */ void slotSetAllFont(QFont newAllFont); /** * Repaint layer of backgroud and layer of pointer, * all panel will be repainted * Da povel k prekreseni urovne pozadi a urovne rucicky. * To znamena, ze bude prekreslen kompletne cely panel. * * @since 0.2 */ void repaintAll (void); protected: virtual void resizeEvent( QResizeEvent * ); virtual void paintEvent( QPaintEvent * ); private: /** * @internal */ void paintBackground ( void ); /** * @internal */ void paintPointerSlowly (QImage &pointerImage, double position, int centerX , int centerY, int widthOfCircle); /** * @internal */ void paintPointerFastly (QImage &pointerImage, double position); /** * @internal */ void paintPartOfCircle ( QPainter *paint, int centerX , int centerY, int widthOfCircle ); /** * @internal */ void paintScale ( QPainter *paint , int centerX , int centerY, int widthOfCircle); /** * @internal */ QImage makeAntialiasing (QImage *myImage, const QRgb colorOfBG, speedOfAAlias speed = slow); /** * @internal */ void makeMotionBlur (QImage *myImage, const QRgb colorOfBG ); /** * @internal */ void paintScaleNumbers ( QPainter *paint ); /** * @internal */ void paintText ( QPainter *paint ); /** * @internal */ void paintValueOfPointer ( QPainter *p, double value); static const int m_widthOfBackGround = 122; static const int m_startOfBackGround = 4; int m_bottomLimit; int m_topLimit; int m_typeOfView; // udava typ meraku int m_countOfParts; // pocet policek na stupnici int m_countOfSubParts; // pocet dilku v policku na stupnici QColor m_pointerColor, m_scaleColor, m_textColor; // colors of pointer, text and scale QColor m_arcColors[9]; QString m_inscription; QString AnMJ; int m_countOfColorParts; // count of color parts on scale double m_valueOfPointer; // position of pointer; double m_angleOfViewer; double m_startAngle; //pocatecni_uhel; int m_centerX; int m_centerY; int m_direction; int m_widthOfScale; int m_radiusOfScaleNumbers; speedOfAAlias m_speedOfAAlias; bool m_makeBlurMotion; QFont m_scaleFont; QFont m_textFont; QPixmap *m_scaleLayerSmall; QImage *m_backgroundBigImage; // background image without antialiasing for KNUT antialiasing QImage *m_backgroundSmallImage; // background image with antiakiasing for default image; extentOfDyeDef m_extentOfDye[5]; QMutex m_pointerMutex; }; #endif knc105/src/knutrwvar.h0000644000175000017500000000656711436653645013203 0ustar dandan/*************************************************************************** knutrwvar.h - description ------------------- begin : So rj 26 2002 copyright : (C) 2002 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTRWVAR_H #define KNUTRWVAR_H #include "knutnet.h" #include #include #include #include class QString; class QGridLayout; /** * This class is graphics interface for changes of RW variables. * Tato trida je graficke rozhrani pro zmenu RW promennych. * * @author Daniel Prynych * @short RW promenne * @version 0.3 */ class KNutRWVar : public KDialog { Q_OBJECT public: /** * Constructor - makes window for change of RW variable. * Konstruktor - vytvori okno pro zmenu RW promene. * * @param uName Describes user name. * @param password Describes password. * @param upsNet is pointer of intance of class KNutNet. * @param userName Urcuje uzivatelske jmeno. * @param userPassword Urcuje heslo. * @param uName Urcuje uzivatelske jmeno. * @param password Urcuje heslo. * @param upsNet Je odkaz na instanci tridy KNutNet. * @since 0.3 **/ KNutRWVar(QString* oldUserName, QString* oldPassword, const QString userName, const QString password, KNutNet* const upsNet, QWidget* parent = 0); /** * Destructor * * @since 0.3 **/ ~KNutRWVar(); /** * Vraci true pokud existuje pripojeni na server a vytvorilo se * ovladaci okno pro nastaveni promennych. * * @since 0.4 **/ bool isUpsOk (void) { return m_upsConnectOk; }; signals: void signalShowMessage (QString message, QString event); private slots: /** * @internal * * Nastavi hodnotu a zpusob vyberu hodnoty promenne. */ void slotChangeVar(int item); /** * @internal * * Sets value of variable on default value * Nastavi hodnotu promenne na puvodni hodnotu. */ virtual void slotDefault (); /** * @internal * * Provede akci */ virtual void slotOk(); /** * @internal * * Find asked item in box * Since at version 3.0.0 is not needed. * Najde pozadovanou polozku v boxu. * Ve verzi qt > 3.0.0 neni potreba. */ signals: /** * Signal je aktivovam pokud je zmenen udaj na kterekoliv strance. * * @param changeSetting Udava co bylo zmeneno. * * @since 0.1 **/ void signalChangeRWVars (QString varName); private: KNutNet *m_upsNet; QString *m_oldUserName; QString *m_oldPassword; KLineEdit *m_lineEditName; KLineEdit *m_lineEditPassword; KComboBox *m_rWVarBox; KComboBox *m_valueVarBox; KLineEdit *m_valueVarLine; QGridLayout *m_passLayout; bool m_upsValueType; bool m_upsConnectOk; }; #endif knc105/src/knutinstcomms.h0000644000175000017500000000512611436653645014044 0ustar dandan/*************************************************************************** knutinstcomms.h - description ------------------- begin : ct rj 24 2002 copyright : (C) 2002 by Daniel Prynych email : Daniel.Prynych@alo.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTINSTCOMMS_H #define KNUTINSTCOMMS_H #include "knutnet.h" #include #include #include #include class QString; /** * This class is graphic interface for runinng of instant commands. * Tato trida je graficke rozhrani pro spusteni okamzitych prikazu. * * @author Daniel Prynych * @short Okamzite prikazy * @version 0.5 */ class KNutInstComms : public KDialog { Q_OBJECT public: /** * Construktor - Creates window for select of instant command. * Konstruktor - vytvori okno pro vyber okamziteho prikazu. * * @param uName Determines user name. * @param password Determines passwprd. * @param uName Urcuje uzivatelske jmeno. * @param password Urcuje heslo. * @param upsNet Je odkaz na instanci tridy KNutNet. * * @since 0.5 **/ KNutInstComms(QString* oldUserName, QString* oldPassword, const QString uName, const QString password, KNutNet* const upsNet, QWidget* parent = 0); /** * Destruktor * * @since 0.4 **/ ~KNutInstComms(); /** * Vraci true pokud existuje pripojeni na server a vytvorilo se * ovladaci okno pro odeslani prikazu. * * @since 0.4 **/ bool isUpsOk (void) { return m_upsConnectOk; }; signals: void signalShowMessage (QString message, QString event); private slots: /** * @internal * * Provede akci, da prikaz k provedeni okamziteho prikazu. */ virtual void slotOk(); private: KNutNet* m_upsNet; QString* m_oldUserName; QString* m_oldPassword; KLineEdit *m_lineEditName; KLineEdit *m_lineEditPassword; KComboBox *m_instCommBox; bool m_upsConnectOk; }; #endif knc105/src/knutprintupsvar.h0000644000175000017500000000754111436653645014430 0ustar dandan/*************************************************************************** knutprintupsvar.h - description ------------------- begin : St cec 3 2002 copyright : (C) 2002 by Daniel Prynych email : Daniel@prynych.cz ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef KNUTPRINTUPSVAR_H #define KNUTPRINTUPSVAR_H #include "knutupsdata.h" #include "knutnet.h" #include #include #include #include #include #include #include class QLabel; class QPixmap; class QFramel; class QString; /** *@author Daniel Prynych */ /** * Tato trida zajistuje zobrazeni vsech promenych, * ktere podporuje prislusny ovladac/driver/model (ovladac) NUTu * pro urcenou UPS-ku * @author Daniel Prynych * @short NUT show UPS vars * @version 0.4 */ class KNutPrintUpsVar : public KDialog { Q_OBJECT public: /** * Constructor - makes window, reads values of variables * and will write names and values of variables * Konstruktor - vytvori okno, nacte hodnoty promennych, * a vypise jmena a hodnoty promenych. * @param upsnet Je odkaz na instanci KNutNet - obsahuje hodnoty promennych systemu NUT. * @param useDescription Urcuje zda pouzit pro promenne a prikazy taky popis. * pokud data o UPS-kach neexistuji vraci funkce upsOk vzdy false. * * since 0.3.1 **/ KNutPrintUpsVar(KNutNet* const upsNet, const bool useDescription, const bool allowNotification, QWidget* parent = 0); /** * @since 0.1 **/ ~KNutPrintUpsVar(); private: /********** private functions ****************/ /** * @internal * adds name into part of tree * Prida jmeno do casti stromu. * @param table is top of tree's part * @param varName is text which is addes into tree on the first column * @param varName is text which is addes into tree on the second column * @param table je vrchol casti stromu. * @param varName je text ktere se prida do stromu na prvni sloupec. * @param value je text ktere se prida do stromu na druhy sloupec. * * @since 0.3 **/ QTreeWidgetItem* addTreeWIdgetItem (QTreeWidgetItem *rootWidget, QString varName, QString value); /** * @internal * Try if name is existed in subtree. * * widgetItem is root /mainItem/ of widget tree. * @param name is name which is found in subtree. * * @since 0.3 **/ QTreeWidgetItem* existTreeWidgetItem (const QTreeWidgetItem *widgetItem, const QString name); /** * @internal * Obarvi radky. * * @since 0.1 **/ void colorRow (void); /** * @internal * * @since 0.1 **/ void colorRowChildren (const QTreeWidgetItem *item, bool &rowBackground ); private slots: /** * @internal * Nacte a prepise hodnoty promenych * * @since 0.3 **/ void slotReloadVars (void); /** * @internal * Repaint background of tree, * * @since 0.1 **/ void slotTreeCollapsedExpanded (QTreeWidgetItem *); /****** private vars ************/ private: KNutNet* m_upsNet; bool m_allowNotification; struct dataVarDef { QString name; QTreeWidgetItem* value; }; QVector m_dataVarList; QTreeWidget* m_treeWidget; KIcon m_iconDir; }; #endif knc105/src/knutclientui.rc0000644000175000017500000000132711436653645014020 0ustar dandan